我有以下数据框:
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'
值。
您发布的数据片段上的错误有点神秘,因为没有公共值,连接操作失败,因为值不重叠它需要您为左侧和右侧提供后缀:
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')
该错误表明这两个表具有 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)
主要是join专门用于基于索引的join,而不是属性名,所以在两个不同的dataframe中改变属性名,然后尝试join,它们会被join,否则会出现这个错误
set_index
,然后它比merge
显着提高了性能。