ChatGPT解决这个技术问题 Extra ChatGPT

熊猫加入问题:列重叠但未指定后缀

我有以下数据框:

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


E
EdChum

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

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

N
Nazim Kerimbekov

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

我想补充一点,必须在两边都应用 set_index,然后它比 merge 显着提高了性能。
R
Reddspark

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

错误消息转换为:“我可以在两个表中看到相同的列,但您没有告诉我在将它们放入同一个表之前重命名其中一个”

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

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

J
Joe Eifert

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

u
user12690524

主要是join专门用于基于索引的join,而不是属性名,所以在两个不同的dataframe中改变属性名,然后尝试join,它们会被join,否则会出现这个错误