Pandas学習ノート:PandasのSettingWithCopyWarningをどのように処理しますか?
2306 ワード
レプリケーション操作警告(SettingWithCopyWarning)とは?
このような警告をどのように処理するかを明らかにするには、まずその意味と出現の原因を明らかにしなければならない.フィルタ(filter)データセット(DataFrame)をフィルタリングすると、データセットをスライスまたは参照する操作は、内在的なプログラム設計または様々な実行の詳細に応じて、ビュー(view)を返すか、コピー(copy)を返す可能性があります.Viewはその名の通り、元のデータを観察するため、ビューを変更しても元のデータを直接変更する可能性があります.一方、コピー(copy)は元のデータのコピーであるため、変更コピーは元のデータに影響しない.ケース1:
解決策、locコマンドを使用する:
ケース2:
なぜなら、df 1はdf'B'列に「w」文字を含むdataframeであり、viewを返し、レプリカcopyを強制的に返すように変更すればよいからです.
このような警告をどのように処理するかを明らかにするには、まずその意味と出現の原因を明らかにしなければならない.フィルタ(filter)データセット(DataFrame)をフィルタリングすると、データセットをスライスまたは参照する操作は、内在的なプログラム設計または様々な実行の詳細に応じて、ビュー(view)を返すか、コピー(copy)を返す可能性があります.Viewはその名の通り、元のデータを観察するため、ビューを変更しても元のデータを直接変更する可能性があります.一方、コピー(copy)は元のデータのコピーであるため、変更コピーは元のデータに影響しない.ケース1:
df = pd.DataFrame({'A': 'aaa bbb ccc ddd eee aaa bbb ccc'.split(),
'B': 'one one one two two two two two'.split(),
'C': [2,35,5,6,8,56,44,72], 'D': [23,36,55,78,81,65,57,99]})
df
A B C D
0 aaa one 2 23
1 bbb one 35 36
2 ccc one 5 55
3 ddd two 6 78
4 eee two 8 81
5 aaa two 56 65
6 bbb two 44 57
7 ccc two 72 99
df[df['A'] == 'aaa']['B'] = 'three'
:1: 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
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
解決策、locコマンドを使用する:
df.loc[df['A'] == 'aaa','B'] = 'three'
df
A B C D
0 aaa three 2 23
1 bbb one 35 36
2 ccc one 5 55
3 ddd two 6 78
4 eee two 8 81
5 aaa three 56 65
6 bbb two 44 57
7 ccc two 72 99
ケース2:
df1 = df[df['B'].str.contains('w')]
df1.loc[df1['A']=='bbb','C'] = 111
D:\pycharm\lib\site-packages\pandas\core\indexing.py:543: 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
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self.obj[item] = s
なぜなら、df 1はdf'B'列に「w」文字を含むdataframeであり、viewを返し、レプリカcopyを強制的に返すように変更すればよいからです.
df1 = df[df['B'].str.contains('w')].copy()
df1.loc[df1['A']=='bbb','C'] = 111
df1
A B C D E
3 ddd two 6 78 156
4 eee two 8 81 162
6 bbb two 111 57 114
7 ccc two 72 99 198