Pandas 合并将产生重复的列
上面的代码定义了两个数据帧对象。我想使用n1中的“zhanghui”字段和n2中的“zhanghui_x”字段作为合并n1和n2的字段,所以我的代码如下:Pandas 合并将产生重复的列,pandas,merge,duplicates,Pandas,Merge,Duplicates,上面的代码定义了两个数据帧对象。我想使用n1中的“zhanghui”字段和n2中的“zhanghui_x”字段作为合并n1和n2的字段,所以我的代码如下: 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,'
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] })
cols_to_use = [i for i in list(n2.columns) if i not in list(n1.columns) ]
然后结果列如下所示:
n1.merge(n2,how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x')
出现了一些重复列,如“无敌x”、“无敌y”。
所以这是熊猫内部的问题,或者我对pd.merge有错误的用法?你的方法是正确的,熊猫会在合并与原始标题重复的列后自动提供postscript,并提供postscript\u x、\u y等 您可以首先选择要合并的列并继续:
sas wudi_x zhanghui ddd wudi_y wudi_x wudi_y zhanghui_x
结果列:
cols_to_use = n2.columns - n1.columns
n1.merge(n2[cols_to_use],how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x')
当我试图运行cols_to_use=n2.columns-n1.columns时,它给了我一个类型错误,如下所示:
sas wudi zhanghui ddd wudi_x wudi_y zhanghui_x
它工作得很好,结果列如下所示:
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] })
cols_to_use = [i for i in list(n2.columns) if i not in list(n1.columns) ]
所以,@S Ringne的方法确实解决了我的问题
=============================================
Pandas只需添加诸如“_x”之类的后缀,就可以解决合并两个帧对象时重复列名的问题
但是,如果“a-column-name”+“ux”的名称形式出现在任一帧对象中,会发生什么情况?我以前认为它会检查“a-column-name”+“ux”的名称形式是否出现,但实际上熊猫没有这个检查 根据pandas文档,合并函数具有以下属性:
sas wudi zhanghui ddd wudi_x wudi_y zhanghui_x
其中后缀表示要附加到“重叠”列的默认后缀字符串,默认值为“\x”和“\y”
我不确定我是否正确理解了你的后续问题,但是
案例1
如果第一个数据框有“column_name_x”列,第二个数据框有“column_name”列,则没有重叠列,因此没有附加后缀
案例2
如果第一个数据框有“column_name”、“column_name_x”列,而第二个数据框也有“column_name”列,则默认后缀会附加到重叠列上,因此第一个数据框的“column_name”变为“column_name_x”,并导致现有列的重复
但是,您可以将None值传递给onenot all后缀,以确保某些数据帧的列名保持原样。请发布所需的输出,这是预期的行为,因为您的行值不同,因此它会将冲突的值作为新的x和y列进行预处理