n1 = DataFrame({'zhanghui':[1,2,3,4] , 'wudi':[17,'gx',356,23] ,'sas'[234,51,354,123] })
n2 = DataFrame({'zhanghui_x':[1,2,3,5] , 'wudi':[17,23,'sd',23] ,'wudi_x':[17,23,'x356',23] ,'wudi_y':[17,23,'y356',23] ,'ddd':[234,51,354,123] })
代码上面定义了两个DataFrame对象。我想用'zhanghui'来自n1和' zhanghui_x'的字段来自n2的字段为" on"字段合并n1和n2,所以我的代码如下:
n1.merge(n2,how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x')
然后给出结果列如下:
sas wudi_x zhanghui ddd wudi_y wudi_x wudi_y zhanghui_x
出现了一些重复的列,例如' wudi_x' ' wudi_y&#39 ;. 那么它是熊猫内心的问题还是我对pd.merge的错误用法?
答案 0 :(得分:0)
你的方法是正确的,pandas在合并了与原始标题“重复”的列之后自动给出了后记,给出了postcript _x,_y等。
您可以先选择要合并的列并继续:
cols_to_use = n2.columns - n1.columns
n1.merge(n2[cols_to_use],how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x')
结果列:
sas wudi zhanghui ddd wudi_x wudi_y zhanghui_x
答案 1 :(得分:0)
当我尝试运行cols_to_use = n2.columns - n1.columns
时,它给了我一个像这样的TypeError:
cannot perform __sub__ with this index type: <class pandas.core.indexes.base.Index'>
然后我尝试使用以下代码:
cols_to_use = [i for i in list(n2.columns) if i not in list(n1.columns) ]
它工作正常,结果列如下:
sas wudi zhanghui ddd wudi_x wudi_y zhanghui_x
所以,@ S Ringne的方法确实解决了我的问题。
=============================================
Pandas只需添加后缀,例如&#39; _x&#39;在合并两个Frame对象时解决重复列名称问题。
但如果名称形式为&#39; a-column-name&#39; +&#39; _x&#39;出现在任何一个Frame对象中?我曾经认为它会检查&#39; a-column-name&#39; +&#39; _x&#39;的名称形式。看来,但实际上大熊猫没有这个检查?
答案 2 :(得分:0)
从熊猫文档中,merge()函数具有以下属性;
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
其中后缀表示要附加到“重叠”列的默认后缀字符串,其默认值为'_ x'和'_ y'。
我不确定我是否正确理解了您的后续问题,但是;
#case1
如果第一个dataFrame的列为'column_name_x',而第二个dataFrame的列为'column_name',则没有重叠的列,因此没有后缀。
#case2
如果第一个dataFrame的列为'column_name','column_name_x',而第二个dataFrame的列也为'column_name',则默认后缀将附加到重叠的列,因此第一帧的'columnn_name'变为'column_name_x',并导致已经存在的列重复。
不过,您可以将 None 值传递给其中一个(不是全部)的后缀,以确保某些dataFrame的列名保持原样。