パンダの結合の問題:列はオーバーラップするが、サフィックスが指定されていない


136

次の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」値があります。

回答:


145

投稿したデータのスニペットに関するエラーは少し不可解です。一般的な値がないため、値が重複しないため結合操作が失敗します。左側と右側にサフィックスを指定する必要があります。

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

32

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

27

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

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

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

1

主に結合は、属性名ではなくインデックスに基づいて結合するためにのみ使用されます。そのため、2つの異なるデータフレームで属性名を変更してから結合しようとすると、結合されます。そうでない場合、このエラーが発生します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.