Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并具有不同维度和相关数据的数据帧_Python_Pandas - Fatal编程技术网

Python 合并具有不同维度和相关数据的数据帧

Python 合并具有不同维度和相关数据的数据帧,python,pandas,Python,Pandas,我有两个不同大小的数据帧,需要以有效的方式合并相关数据: master_df = pd.DataFrame({'kpi_1': [1,2,3,4]}, index=['dn1_app1_bar.com', 'dn1_app2_bar.com', 'dn2_app1_foo.com',

我有两个不同大小的数据帧,需要以有效的方式合并相关数据:

master_df = pd.DataFrame({'kpi_1': [1,2,3,4]},
                         index=['dn1_app1_bar.com',
                                'dn1_app2_bar.com',
                                'dn2_app1_foo.com', 
                                'dn2_app2_foo.com'])


guard_df = pd.DataFrame({'kpi_2': [1,2],
                         'kpi_3': [10,20]},
                         index=['dn1_bar.com', 'dn2_foo.com'])
硕士学位:

                  kpi_1
dn1_app1_bar.com      1
dn1_app2_bar.com      2
dn2_app1_foo.com      3
dn2_app2_foo.com      4
守卫(df):

             kpi_2  kpi_3
dn1_bar.com      1     10
dn2_foo.com      2     20
我想获取一个数据帧,其中的值来自
guard\u df
的行,该行通过
\ucode>索引,并“传播”到所有
master\u df
的匹配行
.*.\u

预期结果:

                  kpi_1  kpi_2  kpi_3
dn1_app1_bar.com      1    1.0   10.0
dn1_app2_bar.com      2    1.0   10.0
dn2_app1_foo.com      3    2.0   20.0
dn2_app2_foo.com      4    2.0   20.0
到目前为止,我所管理的是以下基本方法:

def eval_base_dn(dn):
    chunks = dn.split('_')
    return '_'.join((chunks[0], chunks[2]))

for dn in master_df.index:
    for col in guard_df.columns:
        master_df.loc[dn, col] = guard_df.loc[eval_base_dn(dn), col]

但是我正在寻找一些更有效的方法来“广播”值并合并数据帧。

如果可以使用pandas 0.25+通过
数组
,这里
索引
关于
合并
参数和左连接:

master_df = master_df.merge(guard_df, 
                            left_on=master_df.index.str.replace('_.+_', '_'), 
                            right_index=True, 
                            how='left')
print (master_df)
                  kpi_1  kpi_2  kpi_3
dn1_app1_bar.com      1      1     10
dn1_app2_bar.com      2      1     10
dn2_app1_foo.com      3      2     20
dn2_app2_foo.com      4      2     20
试试这个:

>>pd.merge(master_df.assign(guard_df_id=master_df.index.str.split(“”).map(lambda x:“{0}{1}”。format(x[0],x[-1])),guard_df,left_on=“guard_df_id”,right_index=True)。drop([“guard_df_id”),axis=1)
kpi_1 kpi_2 kpi_3
dn1_app1_bar.com 110
dn1_app2_bar.com 2 11 10
dn2_app1_foo.com 3 2 20
dn2_app2_foo.com 4 2 20

谢谢,使用pandas 0.24+进行了测试,它似乎很有效。如果我遗漏了什么,请纠正我。@attdona-我认为它对pandas 0.24+也很有效。