【问题标题】:Union of two pandas DataFrames两个熊猫数据框的联合
【发布时间】:2019-06-16 08:00:40
【问题描述】:

假设我有两个数据框:

df1:

  A
0 a
1 b

df2:

  A
0 a
1 c

我希望结果是两个框架的 并集,其中 额外的列 显示该行所属的源数据框架。如果出现重复,应删除重复项,并且相应的额外列应显示两个来源:

  A  B
0 a  df1, df2
1 b  df1
2 c  df2

我可以得到没有重复的连接数据帧(df3)如下:

import pandas as pd
df3=pd.concat([df1,df2],ignore_index=True).drop_duplicates().reset_index(drop=True)

我想不出/找到一种方法来控制哪些元素去哪里。如何添加额外的列?

非常感谢您提供的任何提示。

【问题讨论】:

    标签: python pandas dataframe merge concatenation


    【解决方案1】:

    indicator 参数合并,并重新映射结果:

    m = {'left_only': 'df1', 'right_only': 'df2', 'both': 'df1, df2'}
    
    result = df1.merge(df2, on=['A'], how='outer', indicator='B')
    result['B'] = result['B'].map(m)
    
    result
       A         B
    0  a  df1, df2
    1  b       df1
    2  c       df2
    

    【讨论】:

    • 太棒了!你能添加如何为交叉点做同样的事情吗?外->内?
    • @LeonRai df1.merge(df2, on=['A'], how='inner').assign(B='df1, df2')(因为交集意味着两者的成员身份)
    • 知道了!谢谢你的详细解答!
    【解决方案2】:

    我们使用外连接来解决这个问题 -

    df1 = pd.DataFrame({'A':['a','b']})
    df2 = pd.DataFrame({'A':['a','c']})
    df1['col1']='df1'
    df2['col2']='df2'
    df=pd.merge(df1, df2, on=['A'], how="outer").fillna('')
    df['B']=df['col1']+','+df['col2']
    df['B'] = df['B'].str.strip(',')
    df=df[['A','B']]
    df
    
       A        B
    0  a  df1,df2
    1  b      df1
    2  c      df2
    

    【讨论】:

    • 取悦里昂 :)
    【解决方案3】:

    使用下面的命令:

    df3 = pd.concat([df1.assign(source='df1'), df2.assign(source='df2')]) \
        .groupby('A') \
        .aggregate(list) \
        .reset_index()
    

    结果将是:

       A      source
    0  a  [df1, df2]
    1  b       [df1]
    2  c       [df2]
    

    assign 将在您的数据框中添加一个名为source 的列,其值为df1df2groupby 命令将具有相同 A 值的行分组为单行。 aggregate 命令描述了如何为具有相同 A 的每组行聚合其他列 (source)。我使用了list 聚合函数,因此source 列是具有相同A 的值列表。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2016-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多