熊猫DataFrame合并/加入

时间:2020-11-10 09:25:19

标签: python pandas merge

好的,所以我有2个数据框,它们都有一个公共列('ID')。现在,我想将df_2df_1的所有键及其值与它们各自的'ID'相匹配。我在下面添加了一个最小的可复制示例。在这种情况下,ID的顺序相同。但是,事实并非如此。两个DataFrame始终包含相同的ID。需要注意的重要一点是,每个ID都不唯一,但是,两个DataFrame出现一个ID的顺序是相同的。

x = {'ID':[1]*50+[2]*50),
     'row':[9, 2, 8, 4, 2, 5, 2, 1, 1, 6, 5, 6, 3, 1, 1, 2, 1, 2, 3, 8, 3, 2,
       8, 8, 7, 4, 2, 3, 7, 7, 7, 4, 3, 7, 5, 6, 8, 7, 4, 5, 7, 1, 8, 9,
       4, 1, 6, 1, 7, 1, 5, 9, 9, 9, 4, 6, 5, 1, 7, 9, 5, 9, 6, 8, 6, 7,
       4, 3, 4, 4, 7, 2, 7, 8, 6, 6, 8, 5, 4, 9, 9, 4, 3, 9, 7, 8, 3, 5,
       1, 6, 1, 6, 8, 2, 1, 4, 3, 7, 7, 6], 
     'block':[2, 8, 8, 2, 4, 1, 6, 4, 2, 7, 7, 1, 3, 1, 4, 8, 4, 2, 5, 2, 4, 9,
       3, 6, 6, 1, 4, 2, 7, 4, 4, 1, 9, 8, 5, 1, 1, 4, 6, 4, 9, 1, 7, 4,
       5, 3, 6, 2, 6, 8, 5, 9, 5, 8, 1, 8, 3, 3, 5, 7, 3, 2, 5, 9, 6, 4,
       3, 9, 7, 5, 2, 1, 2, 4, 6, 7, 7, 8, 2, 2, 7, 7, 9, 3, 8, 7, 3, 3,
       1, 4, 6, 2, 6, 2, 8, 1, 1, 7, 5, 1]}

y = {'ID':[1]*50+[2]*50), 
     'Var1':[8, 3, 8, 3, 3, 2, 7, 8, 9, 6, 5, 6, 6, 3, 8, 3, 6, 4, 6, 2, 6, 2,
       7, 3, 4, 7, 4, 9, 1, 5, 5, 5, 2, 9, 2, 5, 5, 1, 9, 9, 8, 2, 4, 2,
       8, 7, 5, 8, 3, 9, 5, 9, 1, 1, 9, 9, 6, 3, 7, 1, 9, 8, 3, 3, 5, 7,
       3, 8, 9, 1, 5, 2, 3, 3, 5, 5, 9, 6, 7, 4, 4, 1, 9, 7, 9, 8, 5, 4,
       2, 5, 5, 8, 7, 5, 9, 9, 4, 5, 4, 8], 
     'Var2':[3, 3, 3, 8, 9, 5, 7, 5, 5, 3, 7, 5, 7, 7, 2, 1, 3, 9, 8, 5, 5, 1,
       1, 8, 5, 3, 1, 5, 4, 3, 5, 2, 3, 2, 7, 3, 9, 4, 8, 4, 6, 6, 2, 3,
       8, 3, 3, 6, 6, 4, 8, 4, 1, 9, 8, 9, 5, 7, 6, 9, 4, 6, 8, 5, 7, 2,
       2, 8, 9, 1, 9, 4, 8, 8, 6, 8, 1, 1, 4, 7, 8, 4, 1, 2, 2, 9, 5, 3,
       7, 4, 5, 4, 5, 1, 2, 3, 5, 9, 2, 4]}

df_1 = pd.DataFrame(x)
df_2 = pd.DataFrame(y)

我的方法:

def add_analysis(data, ana):
   for key in ana.keys():
       if key == 'ID':
           continue
       add_db_key(ana, data, key)

def add_db_key(data_db, data_loaded, key):
    for ID in data_db.ID:
        data_loaded.loc[data_loaded['ID'] == ID, key] = data_db[data_db.ID == ID][key].values

add_analysis(df_1, df_2)

可以正常工作,但是,由于我要遍历DataFrame的每一列和每一行,所以它将永久占用大型DataFrame。我觉得这效率很低,并且可能会有合并操作可以解决问题,但是,最重要的是ID必须匹配并且顺序必须保留。非常感谢提供有关要查看其功能的指针的帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

您的函数对我不起作用(它们没有返回值)。 但是,如果我理解正确,则可以使用以下方法解决问题:

df_1['ID_idx'] = df_1.reset_index().apply(lambda x: f"{x['ID']}_{x['index']}", axis=1)
df_2['ID_idx'] = df_1.reset_index().apply(lambda x: f"{x['ID']}_{x['index']}", axis=1)
df = df_1.merge(df_2, right_on='ID_idx', left_on='ID_idx')

并最终删除不需要的列。