teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/02/25 07:49

投稿

bsdfan
bsdfan

スコア4925

answer CHANGED
@@ -2,4 +2,24 @@
2
2
 
3
3
  また、ここにあるコードの部分だけでは、SettingWithCopyWarningは出ないはずです。
4
4
  例えば、このdfが別のデータフレームから抜き出したものだったりすると、この警告が出ることもあります。
5
- (それによって対処が違います)
5
+
6
+ ```python
7
+ df = pd.DataFrame({'A': [5, 7, 9, 10], 'B': [-6, -2, -11, -5]})
8
+ df['A'] = np.where(df['A'] > -df['B'], df['A'], 0)
9
+ ```
10
+ だと警告は出ませんが、
11
+ ```python
12
+ df0 = pd.DataFrame({'A': [5, 7, 9, 10, 100], 'B': [-6, -2, -11, -5, -100]})
13
+ df = df0[:4]
14
+ df['A'] = np.where(df['A'] > -df['B'], df['A'], 0)
15
+ ```
16
+ だと警告が出ます。
17
+ 理由は警告に出てくるリンク先[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で検索すれば説明しているところがいろいろ見つかると思います。
18
+
19
+ 警告を消す一番簡単な方法は、コピーしてしまうことですが、大元のデータフレーム(上の例のdf0)を更新したいケースでは、正しい対処法ではないです。
20
+ ```python
21
+ df = df.copy()
22
+ flg = df['A'] > -df['B']
23
+ df['A'] = np.where(flg, df['A'], 0)
24
+ df['B'] = np.whare(~flg, df['B'], 0)
25
+ ```