根据关键列合并3个熊猫

时间:2019-04-17 13:36:37

标签: python pandas

我是熊猫新手,我有3个CSV文件从MySql数据库中提取并存储在熊猫数据框中。我为所有3个文件生成了一个顺序ID,如下所示:

df1
id1 key_column1 name1
 1   567       qqq
 2   898       rrr
 3   345       bbb

df2
id2 key_column2 name2
 4   967       qqqq
 5   998       rrrr
 6   945       bbbb

df3
id3 key_column1 key_column2
 7   345       967     
 8   567       945       

df1和df2代表2个表,它们的原始key_columns分别是key_column1和key_column2。 df3包含基于df1和df2的key_columns的映射。现在df3必须根据生成的顺序ID进行映射,它必须看起来像这样

 df3
  id3 id1  id2 key_column1 key_column2
   7   3    4     345       967     
   8   1    6     567       945       

我最初尝试合并一列,但没有任何值。

df=pd.merge(df1,df3,left_on=df1['key_column1'],right_on=df3['key_column1'],how='inner')

3 个答案:

答案 0 :(得分:1)

您可以根据df3中的列创建一个字典,并将其用于map中的值key_column1

map_ = dict(zip(df3.key_column1, df3.key_column2))
key_df1 = df1.key_column1.map(map_).fillna(0)

然后merge两个数据帧现在具有相同的键:

(df1.merge(df2, left_on= key_df1, right_on='key_column2')
    .drop(['name1', 'name2'], 1))

    id1  key_column1  id2  key_column2
0    1          567    6          945
1    3          345    4          967

答案 1 :(得分:1)

我们可以使用DataFrame.merge两次来将三个数据帧组合在一起。之后,我们使用DataFrame.iloc删除不需要的列。

df_all = df3.merge(df2, on='key_column2', suffixes=['', '_2'])\
            .merge(df1, on='key_column1', suffixes=['', '_1'])\
            .iloc[:, :-4]

print(df_all)
   id3  id1  id2  key_column1  key_column2
0    7    3    4          345          967
1    8    1    6          567          945

答案 2 :(得分:1)

这似乎对我有用。

df3.merge(df1,how='left',on='key_column1').merge(df2,how='left',on='key_column2')

   id3  key_column1  key_column2  id1 name1  id2 name2
0    7          345          967    3   bbb    4  qqqq
1    8          567          945    1   qqq    6  bbbb