Pandas:合并两个 1D DataFrame,输出两列,并为唯一元素填充填充值

Posted

技术标签:

【中文标题】Pandas:合并两个 1D DataFrame,输出两列,并为唯一元素填充填充值【英文标题】:Pandas: Merge two 1D DataFrames outputting both columns with fill-values for unique elements 【发布时间】:2017-06-15 08:50:34 【问题描述】:

我有这两个数据框:

import pandas as pd
df1 = pd.DataFrame('A':[1,2,4,6])
df2 = pd.DataFrame('A':[1,2,3,6])


df1
Out[27]: 
   A
0  1
1  2
2  4
3  6

df2
Out[28]: 
   A
0  1
1  2
2  3
3  6

我想以保留两列的方式合并它们,不考虑索引而连接公共值,并且在另一行中保留唯一值和填充值,也就是说,我想要这个结果:

   A_x  A_y
0  1.0  1.0
1  2.0  2.0
2  NaN  3.0
3  4.0  NaN
4  6.0  6.0

我试过了

pd.merge(df1,df2,on=['A'],how='outer')
pd.concat([df1,df2],axis=1,join='outer')

但是这两个没有产生预期的结果。我用不同的选择尝试过它们,但没有运气。

我还研究了其他方法,例如 appendassign,但似乎没有一个提供执行此操作的功能。

我觉得这是一个常见的操作,应该有一个简单直接的解决方案,所以我可能会忽略一些明显的东西。

你能告诉我它是怎么做的吗?

【问题讨论】:

它可能不适合您的需要,但如果您想保留两列以便比较和对比重叠部分,您可能对indicator keyword argument 对merge 感兴趣。它添加了一个带注释的列,显示该行在合并之前是否存在于左侧、右侧或两列中。 这是很有价值的信息,谢谢。 【参考方案1】:

concat 的解决方案通过index 连接值,因此需要set_index

df = pd.concat([df1.set_index('A', drop=False).A,
                df2.set_index('A', drop=False).A],
                axis=1, 
                keys=('A_x','A_y')).reset_index(drop=True)
print (df)
   A_x  A_y
0  1.0  1.0
1  2.0  2.0
2  NaN  3.0
3  4.0  NaN
4  6.0  6.0

【讨论】:

谢谢,我有预感要使用set_index()【参考方案2】:
df2 = df2.set_index('A', drop=False)
kws = dict(on='A', lsuffix='_x', rsuffix='_y', how='outer')
df1.join(df2, **kws).drop('A', 1)

   A_x  A_y
0  1.0  1.0
1  2.0  2.0
2  4.0  NaN
3  6.0  6.0
3  NaN  3.0

【讨论】:

以上是关于Pandas:合并两个 1D DataFrame,输出两列,并为唯一元素填充填充值的主要内容,如果未能解决你的问题,请参考以下文章

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame

合并具有来自两个不同列的匹配值的 DataFrame - Pandas [重复]

合并两个日期字段在两个月内的 pandas DataFrame

将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

Python - Pandas Dataframe 以正确的方式合并两个数据框

Pandas:用于合并两个多索引 DataFrame 的类似 merge_asof 的解决方案?