回答編集履歴

1

追記

2021/02/25 07:49

投稿

bsdfan
bsdfan

スコア4794

test CHANGED
@@ -6,4 +6,44 @@
6
6
 
7
7
  例えば、このdfが別のデータフレームから抜き出したものだったりすると、この警告が出ることもあります。
8
8
 
9
- (それによって対処が違います)
9
+
10
+
11
+ ```python
12
+
13
+ df = pd.DataFrame({'A': [5, 7, 9, 10], 'B': [-6, -2, -11, -5]})
14
+
15
+ df['A'] = np.where(df['A'] > -df['B'], df['A'], 0)
16
+
17
+ ```
18
+
19
+ だと警告は出ませんが、
20
+
21
+ ```python
22
+
23
+ df0 = pd.DataFrame({'A': [5, 7, 9, 10, 100], 'B': [-6, -2, -11, -5, -100]})
24
+
25
+ df = df0[:4]
26
+
27
+ df['A'] = np.where(df['A'] > -df['B'], df['A'], 0)
28
+
29
+ ```
30
+
31
+ だと警告が出ます。
32
+
33
+ 理由は警告に出てくるリンク先[https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy](https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy)を見るか、SettingWithCopyWarningで検索すれば説明しているところがいろいろ見つかると思います。
34
+
35
+
36
+
37
+ 警告を消す一番簡単な方法は、コピーしてしまうことですが、大元のデータフレーム(上の例のdf0)を更新したいケースでは、正しい対処法ではないです。
38
+
39
+ ```python
40
+
41
+ df = df.copy()
42
+
43
+ flg = df['A'] > -df['B']
44
+
45
+ df['A'] = np.where(flg, df['A'], 0)
46
+
47
+ df['B'] = np.whare(~flg, df['B'], 0)
48
+
49
+ ```