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

时间:2014-10-30 05:09:06

标签: python join pandas

我有以下2个数据框:

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

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 个答案:

答案 0 :(得分:101)

您发布的数据片段上的错误有点神秘,因为没有常见值,连接操作失败,因为值不重叠,需要您为左右手提供后缀侧:

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

答案 1 :(得分:18)

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

答案 2 :(得分:16)

此错误表示两个表具有1个或多个具有相同列名的列名。该错误消息转换为:“我可以在两个表中看到相同的列,但您没有告诉我在将其中一个引入之前重命名”

您要么在使用del df ['column name']从另一列中删除其中一列之前删除其中一列,要么使用lsuffix重写原始列,或者使用rsuffix重命名正在使用的列之一带来了它。

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

答案 3 :(得分:3)

错误说明两个表有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)

答案 4 :(得分:2)

主要连接是专门用于基于索引的连接,而不是基于属性名称的连接,因此请在两个不同的数据框中更改属性名称,然后尝试连接,它们将被连接,否则会出现此错误