两个熊猫数据框的联合
Posted
技术标签:
【中文标题】两个熊猫数据框的联合【英文标题】: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)
我想不出/找到一种方法来控制哪些元素去哪里。如何添加额外的列?
非常感谢您提供的任何提示。
【问题讨论】:
【参考方案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
【讨论】:
太棒了!你能添加如何为交叉点做同样的事情吗?外->内? @LeonRaidf1.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
的列,其值为df1
和df2
。 groupby
命令将具有相同 A
值的行分组为单行。 aggregate
命令描述了如何为具有相同 A
的每组行聚合其他列 (source
)。我使用了list
聚合函数,因此source
列是具有相同A
的值列表。
【讨论】:
以上是关于两个熊猫数据框的联合的主要内容,如果未能解决你的问题,请参考以下文章