使用pandas合并具有不同列名称的列,并避免重复。

20

我该如何将两个拥有不同列名的pandas DataFrame按照两列合并,并保留其中一列?

df1 = pd.DataFrame({'UserName': [1,2,3], 'Col1':['a','b','c']})
df2 = pd.DataFrame({'UserID': [1,2,3], 'Col2':['d','e','f']})
pd.merge(df1, df2, left_on='UserName', right_on='UserID')

这提供了一个像这样的DataFrame:

enter image description here

但显然我是在UserNameUserID上合并,所以它们是相同的。我希望它看起来像这样。有没有简洁的方法可以做到这一点?

enter image description here

我能想到的方法只有将合并前的列重命名为相同的名称,或者在合并后删除其中一个。如果pandas自动删除其中一个或者我可以执行类似于以下代码的操作将会很好:

pd.merge(df1, df2, left_on='UserName', right_on='UserID', keep_column='left')
2个回答

17

那么将 UserID 设置为索引,然后在第二个数据框上使用索引进行连接如何?

pd.merge(df1, df2.set_index('UserID'), left_on='UserName', right_index=True)

#   Col1    UserName    Col2
# 0    a           1       d
# 1    b           2       e
# 2    c           3       f

很好的回答。我几乎和 OP 做了一样的事情,结果得到了冗余列。从你的代码中读取,我理解如果我按索引连接左右两个表,那么该列将会“合并”到索引列中,因此不会出现在结果中?谢谢。 - Bowen Liu

10

这并没有什么真正好的地方:它的目的是将列保持为像left right或outer joins这样的大型情况,以便带来更多的信息。不要试图过度设计您的合并行,在您建议的时候要明确。

解决方案1:

df2.columns = ['Col2', 'UserName']

pd.merge(df1, df2,on='UserName')
Out[67]: 
  Col1  UserName Col2
0    a         1    d
1    b         2    e
2    c         3    f

解决方案2:

pd.merge(df1, df2, left_on='UserName', right_on='UserID').drop('UserID', axis=1)
Out[71]: 
  Col1  UserName Col2
0    a         1    d
1    b         2    e
2    c         3    f

请注意,解决方案2很危险 - 如果df1也恰好有(可能是无关的)UserID列,则无法正常工作。我实际上在实际应用程序中遇到过这种情况。在这种情况下,解决方案2实际上会抛出一个错误,因为没有名为“UserID”的列,只有“UserID_x”和“UserID_y”! - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接