熊猫合并具有不同名称的列并避免重复[重复]

Posted

技术标签:

【中文标题】熊猫合并具有不同名称的列并避免重复[重复]【英文标题】:pandas merge on columns with different names and avoid duplicates [duplicate] 【发布时间】:2017-02-20 12:04:59 【问题描述】:

如何将两个 pandas DataFrames 合并到具有不同名称的两列上并保留其中一列?

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

但显然我正在合并UserNameUserID,所以它们是相同的。我希望它看起来像这样。有什么干净的方法可以做到这一点吗?

只有我能想到的方法是在合并之前将列重命名为相同,或者在合并后删除其中一个。如果 pandas 自动丢弃其中一个我会很好,或者我可以做类似的事情

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

【问题讨论】:

【参考方案1】:

如何将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 并得到了冗余列。从您的代码中读取,我认为如果我通过索引连接左右,该列将“合并”到索引列中,因此不会显示在结果中?谢谢。【参考方案2】:

其中没有什么特别好的:它的目的是保留列,因为较大的情况,如左右连接或外连接,会带来两列的额外信息。不要试图过度设计你的合并线,按照你的建议明确

解决方案 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 实际上会引发错误,因为将有 no 列名为“UserID”,只有“UserID_x”和“UserID_y”!

以上是关于熊猫合并具有不同名称的列并避免重复[重复]的主要内容,如果未能解决你的问题,请参考以下文章

熊猫在合并时强制到数据帧中的后缀

Python合并两个具有不同日期时间的数据框[重复]

与熊猫外部合并时出现重复问题

熊猫合并:合并同一列上的两个数据框,但保留不同的列

熊猫在不同长度的列上合并两个数据框

将包含列表的列拆分为熊猫中的不同行[重复]