熊猫合并具有不同名称的列并避免重复[重复]
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
但显然我正在合并UserName
和UserID
,所以它们是相同的。我希望它看起来像这样。有什么干净的方法可以做到这一点吗?
只有我能想到的方法是在合并之前将列重命名为相同,或者在合并后删除其中一个。如果 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”!以上是关于熊猫合并具有不同名称的列并避免重复[重复]的主要内容,如果未能解决你的问题,请参考以下文章