如何在Pandas Merge时避免自动生成key_0列?
问题描述
合并两个列名不同的DataFrame时,不想修改原有列名,但合并后自动生成了key_0列。希望不通过重命名连接列或额外执行drop操作,直接通过merge的参数避免生成该列。
示例代码如下:
import pandas as pd dict_1 = {'Col1':['A1','A2','A3','A4','A1','A3','A4'], 'Col2':['B1','B1','B2','B3','B2','B4','B4'], 'Col3':[i for i in range(10,17)], 'Col4':[i for i in range(20,27)], 'Col5':[i for i in range(30,37)], 'Col6':[i for i in range(40,47)]} dict_2 = {'Col11':['A1','A2','A1','A4'], 'Col12':['C1','C2','C4','C3'], 'Col13':[i for i in range(12,16)], 'Col14':[i for i in range(21,25)], 'Col15':[i for i in range(32,36)], 'Col16':[i for i in range(41,45)]} df_1 = pd.DataFrame(dict_1) df_2 = pd.DataFrame(dict_2)
原合并代码:
pd.merge(left=df_1,right=df_2['Col12'],left_on=df_1['Col1'],right_on=df_2['Col11'],how='left',suffixes=(None,None))
解决方案
你之所以会生成额外的key_0列,根源是给left_on和right_on传递的是Series对象(比如df_1['Col1']、df_2['Col11']),而非列名的字符串。当merge用Series作为连接键时,pandas会自动把这个临时键存成key_0列。
要直接避免这个问题,只需要把left_on和right_on改成对应列名的字符串,同时调整right参数,让它包含连接列(Col11)和你需要的Col12列:
# 修正后的合并代码 result = pd.merge( left=df_1, right=df_2[['Col11', 'Col12']], # 只保留需要的连接列和目标列 left_on='Col1', # 用列名字符串替代Series right_on='Col11', how='left', suffixes=(None, None) )
这样合并后的结果只会保留两个原DataFrame的列,不会出现key_0。
如果你的需求只是把df_2的Col12匹配到df_1上,也可以用map的方式,代码更简洁:
# 单列匹配的简化写法 df_1['Col12'] = df_1['Col1'].map(df_2.set_index('Col11')['Col12'])
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

