使用完全外连接在 pandas 中连接两个数据框

Posted

技术标签:

【中文标题】使用完全外连接在 pandas 中连接两个数据框【英文标题】:Joining two dataframes in pandas using full outer join 【发布时间】:2018-05-10 08:09:40 【问题描述】:

我在 pandas 中有两个数据框,如下所示。 EmpID 是两个数据帧中的主键。

df_first = pd.DataFrame([[1, 'A',1000], [2, 'B',np.NaN],[3,np.NaN,3000],[4, 'D',8000],[5, 'E',6000]], columns=['EmpID', 'Name','Salary'])
df_second = pd.DataFrame([[1, 'A','HR','Delhi'], [8, 'B','Admin','Mumbai'],[3,'C','Finance',np.NaN],[9, 'D','Ops','Banglore'],[5, 'E','Programming',np.NaN],[10, 'K','Analytics','Mumbai']], columns=['EmpID', 'Name','Department','Location'])

我想用 EmpID 加入这两个数据帧,以便

    如果存在且键匹配,则可以用另一个表中的值填充一个数据框中的缺失数据 如果存在带有新键的观察结果,则应将它们附加到结果数据框中

我使用下面的代码来实现这一点。

merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])

但是这段代码给了我不想要的重复列,所以我只使用两个表中的唯一列进行合并。

ColNames = list(df_second.columns.difference(df_first.columns))
ColNames.append('EmpID')
merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])

现在我没有得到重复的列,但在键匹配的观察中也没有得到值。

如果有人能帮我解决这个问题,我将不胜感激。

问候, 凯拉什·内吉

【问题讨论】:

【参考方案1】:

看来你需要combine_firstset_index 来匹配由列EmpID 创建的索引:

df = df_first.set_index('EmpID').combine_first(df_second.set_index('EmpID')).reset_index()
print (df)
   EmpID   Department  Location Name  Salary
0      1           HR     Delhi    A  1000.0
1      2          NaN       NaN    B     NaN
2      3      Finance       NaN    C  3000.0
3      4          NaN       NaN    D  8000.0
4      5  Programming       NaN    E  6000.0
5      8        Admin    Mumbai    B     NaN
6      9          Ops  Banglore    D     NaN
7     10    Analytics    Mumbai    K     NaN

编辑:

对于某些列顺序需要reindex:

#concatenate all columns names togetehr and remove dupes
ColNames = pd.Index(np.concatenate([df_second.columns, df_first.columns])).drop_duplicates()
print (ColNames)
Index(['EmpID', 'Name', 'Department', 'Location', 'Salary'], dtype='object')

df = (df_first.set_index('EmpID')
      .combine_first(df_second.set_index('EmpID'))
      .reset_index()
      .reindex(columns=ColNames))
print (df)
   EmpID Name   Department  Location  Salary
0      1    A           HR     Delhi  1000.0
1      2    B          NaN       NaN     NaN
2      3    C      Finance       NaN  3000.0
3      4    D          NaN       NaN  8000.0
4      5    E  Programming       NaN  6000.0
5      8    B        Admin    Mumbai     NaN
6      9    D          Ops  Banglore     NaN
7     10    K    Analytics    Mumbai     NaN

【讨论】:

这个解决方案可以达到目的,但只是想检查我们是否可以保留列的顺序。所以首先我们应该有来自第一个数据帧的列,然后是第二个数据帧。我还在考虑是否可以使用外连接来完成。 不确定是否理解,为什么?你能解释更多吗? 我的真实数据集大约有 200 列,它们按特定顺序设置。数据集已经按此顺序很长时间了,执行此操作会导致排序的列顺序,而处理此数据集的人不习惯这种顺序。所以我只是在想是否有一种方法可以保留列的顺序。 我为它添加了解决方案。需要某种方式按您想要的顺序创建所有列的列表,但要避免使用像 intersectionunion 这样的函数,因为它们对值进行排序。最后重新索引。

以上是关于使用完全外连接在 pandas 中连接两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用完全外连接合并两个数据帧在两个数据帧上没有获得关键列

使用 pandas.merge_asof 进行完全外连接

只外连接 python pandas

使用包含的左外连接 Pandas 数据框

两个数据帧的完全外连接

pyspark 数据帧中的完全外连接