Pandas连接问题:列重叠但未指定后缀

233 投票
5 回答
394032 浏览
提问于 2025-04-30 13:22

我有以下的数据框:

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

撰写回答