Pandas での修正方法:settingwithcopywarning


パンダを使用するときに遭遇する可能性のある警告の 1 つは次のとおりです。

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

この警告は、パンダがチェーン割り当てと呼ばれるもの (チェーンと割り当てを 1 ステップで組み合わせたもの) に遭遇したときに表示されます。

これは単なる警告であり、エラーではないことに注意することが重要です。コードは引き続き実行されますが、結果が必ずしも期待どおりになるとは限りません。

この警告を抑制する最も簡単な方法は、次のコードを使用することです。

 p.d. options . fashion . chained_assignment = None

次の例は、この警告に実際に応答する方法を示しています。

警告を再現する方法

次のパンダ データフレームを作成するとします。

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

ここで、元の DataFrame の列 “A” のみを含む新しい DataFrame を作成し、列 “A” の各値を 2 で除算するとします。

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

元の DataFrame の「スライス」の列「A」に新しい値を設定しているため、 SettingWithCopyWarningメッセージを受け取ります。

ただし、作成した新しい DataFrame を見ると、各値が実際には 2 で正常に除算されていることがわかります。

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

警告メッセージを受け取ったにもかかわらず、パンダは私たちがやろうと思ったことをやりました。

警告を回避する方法

この警告を回避するには、次のように.loc[row Indexer, Col Indexer]構文を使用することをお勧めします。

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

新しいデータフレームには、元のデータフレームの列「A」のすべての値を 2 で割った値が含まれており、警告メッセージは表示されません。

警告メッセージが表示されないようにしたい場合は、次のコードを使用できます。

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

チェーン割り当てを回避する必要がある理由の詳細については、 オンラインの pandas ドキュメントを参照してください。

追加リソース

修正方法: pandas という名前のモジュールがありません
修正方法: numpy という名前のモジュールがありません
修正方法: 列が重なっていますが、サフィックスが指定されていません

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です