web-dev-qa-db-ja.com

パンダの結合の問題:列は重複していますが、接尾辞が指定されていません

次の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

これら2つのデータフレームを結合しようとすると:

join_df = df_a.join(df_b,on='mukey',how='left')

エラーが表示されます:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

これはなぜですか?データフレームには共通の「mukey」値があります。

98
user308827

投稿したデータのスニペットのエラーは少しわかりにくいです。共通の値がないため、値が重複しないため、左側と右側に接尾辞を指定する必要があるため、結合操作が失敗します。

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
102
EdChum

.join()関数は、渡された引数データセットのindexを使用しているため、代わりにset_indexを使用するか、.merge関数を使用する必要があります。

あなたのケースで動作するはずの2つの例を見つけてください:

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

18

このエラーは、2つのテーブルに同じ列名を持つ1つ以上の列名があることを示しています。エラーメッセージは次のように変換されます。「両方のテーブルに同じ列が表示されていますが、どちらか一方を取り込む前に名前を変更するように指示されていません」

Del df ['column name']を使用して、他の列から取り込む前に列の1つを削除するか、lsuffixを使用して元の列を書き直すか、rsuffixを使用して列を変更します。

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