【问题标题】:Merge 3 pandas based on key columns根据键列合并 3 个 pandas
【发布时间】:2019-04-17 13:36:37
【问题描述】:

我是 pandas 的新手,我有 3 个从 MySql 数据库中提取并存储在 pandas 数据框中的 CSV 文件。我为所有 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')

【问题讨论】:

  • 请向我们展示您迄今为止所做的尝试。谢谢。
  • df= pd.merge(df1,df3,left_on=df1['key_column1'],right_on=df3['key_column1'],how='inner')
  • 根据结果,您的代码没有显示任何值。你只需要删除一些你不想要的列并重命名它。请添加更多示例,其中您获得无值

标签: python pandas


【解决方案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

【讨论】:

    【解决方案2】:

    我们可以使用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
    

    【讨论】:

    • 谢谢!没有列名(没有标题)如何工作
    • 这是一个熊猫数据框。所有列都被命名,如果你想要底层的numpy数组,只需使用df.values方法@K.soula
    【解决方案3】:

    这似乎对我有用。

    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
    

    【讨论】:

    • 注意这只是合并。您可以轻松地删除合并后的列。
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多