熊猫连接问题:列重叠但没有指定后缀

我有以下数据帧:

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'值。

323023 次浏览

你发布的数据片段上的错误有点神秘,因为没有共同的值,连接操作失败,因为值不重叠,它需要你为左边和右边提供一个后缀:

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

.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')

此错误指示两个表具有一个或多个具有相同列名的列名。

错误信息翻译为:“我可以在两个表中看到相同的列,但您没有告诉我在将它们带入同一表之前重命名它们”;

你可以使用del df['column name']在将其中一列从另一列引入之前删除它,或者使用lsuffix重写原来的列,或者使用rsuffix重命名正在引入的列。

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')

join主要是专门用于基于索引的连接,而不是基于属性名的连接,所以在两个不同的数据框架中更改属性名,然后尝试连接,它们将被连接,否则将引发此错误

错误指示两个表有1个或多个具有相同列名的列名。

任何有同样错误但不想提供后缀的人都可以重命名列。如果你不想提供on='mukey'设置,也要确保两个dataframe的索引在类型和值上匹配。

# 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)