Pandas连接问题:列重叠但未指定后缀
我有以下的数据框:
print(df_a)
mukey DI PI
0 100000 35 14
1 1000005 44 14
2 1000006 44 14
3 1000007 43 13
4 1000008 43 13
print(df_b)
mukey niccdcd
0 190236 4
1 190237 6
2 190238 7
3 190239 4
4 190240 7
当我尝试把这些数据框合并在一起时:
join_df = df_a.join(df_b, on='mukey', how='left')
我遇到了这个错误:
*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')
这是为什么呢?这些数据框确实有共同的 'mukey'
值。
5 个回答
3
主要是因为 join 这个操作是根据索引来连接的,而不是根据属性名称来连接的。所以如果你在两个不同的数据表中改变了属性名称,然后再尝试连接,它们就可以成功连接;否则就会出现这个错误。
9
这个错误提示说明这两个表里有一个或多个列的名字是一样的。
如果你遇到同样的错误,但不想加后缀的话,可以考虑直接重命名这些列。另外,如果你不想使用 on='mukey'
这个设置,确保两个数据框的索引在类型和数值上是匹配的。
# rename example
df_a = df_a.rename(columns={'a_old': 'a_new', 'a2_old': 'a2_new'})
# set the index
df_a = df_a.set_index(['mukus'])
df_b = df_b.set_index(['mukus'])
df_a.join(df_b)
55
这个错误意味着这两个表里有一个或多个列的名字是一样的。
错误信息的意思是:“我发现这两个表里有同样的列名,但你没有告诉我在把它们放到同一个表之前要把其中一个改个名字。”
你可以选择在把其中一个表的数据导入之前,先删除那个重复的列,方法是用 del df['列名']
;或者使用 lsuffix
来给原来的列加个后缀,或者用 rsuffix
来给要导入的列改个名字。
df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
67
.join()
这个函数是根据你传入的数据集的index
来工作的,所以你应该使用set_index
,或者可以用.merge
函数来代替。
下面有两个例子,应该能在你的情况下正常工作:
join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')
或者
join_df = df_a.merge(df_b, on='mukey', how='left')
241
你发的那段数据错误信息有点难懂。因为没有共同的值,所以连接操作失败了,因为这些值没有重叠。你需要为左右两边提供一个后缀:
In [173]:
df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
Out[173]:
mukey_left DI PI mukey_right niccdcd
index
0 100000 35 14 NaN NaN
1 1000005 44 14 NaN NaN
2 1000006 44 14 NaN NaN
3 1000007 43 13 NaN NaN
4 1000008 43 13 NaN NaN
merge
之所以能工作,是因为它没有这个限制:
In [176]:
df_a.merge(df_b, on='mukey', how='left')
Out[176]:
mukey DI PI niccdcd
0 100000 35 14 NaN
1 1000005 44 14 NaN
2 1000006 44 14 NaN
3 1000007 43 13 NaN
4 1000008 43 13 NaN