Pandas学習ノート:PandasのSettingWithCopyWarningをどのように処理しますか?

2306 ワード

レプリケーション操作警告(SettingWithCopyWarning)とは?
このような警告をどのように処理するかを明らかにするには、まずその意味と出現の原因を明らかにしなければならない.フィルタ(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