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

回答編集履歴

2

追記

2020/01/19 17:39

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -24,4 +24,27 @@
24
24
  4 2.34
25
25
  5 6.00
26
26
  6 3.45
27
- ```
27
+ ```
28
+
29
+ ---
30
+
31
+ > また
32
+ > ```python
33
+ > df[df['pH'].isnull()]["pH"]=pH_pred
34
+ > ```
35
+ > で予測値を代入しようとして、エラーが出ないのに代入されていないのもわかりません。
36
+
37
+ 私の環境では警告が出ました。
38
+
39
+ ```python
40
+ >>> df[df['pH'].isnull()]["pH"]=ph_pred
41
+ __main__:1: SettingWithCopyWarning:
42
+ A value is trying to be set on a copy of a slice from a DataFrame.
43
+ Try using .loc[row_indexer,col_indexer] = value instead
44
+
45
+ See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
46
+ ```
47
+
48
+ pandasのcopyとview関連の挙動については私も全貌を把握しきれていないので、詳細な説明は警告に示されているリファレンスに譲りたいと思います。
49
+
50
+ 結論としては、locやilocを使って代入すれば問題ないです。

1

書き換え

2020/01/19 17:39

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -3,21 +3,25 @@
3
3
  ```python
4
4
  >>> import pandas as pd
5
5
  >>> import numpy as np
6
- >>> df = pd.DataFrame({"ph":[np.nan, np.nan, np.nan]}, index=[41, 45, 51])
6
+ >>> df = pd.DataFrame({"pH":[1, 2, np.nan, 4, np.nan, 6, np.nan]})
7
- >>> df
8
- ph
9
- 41 NaN
10
- 45 NaN
11
- 51 NaN
12
7
  >>> ph_pred = np.array([1.23, 2.34, 3.45])
13
- >>> ph_pred
14
- array([1.23, 2.34, 3.45])
15
- >>> df["ph"] = ph_pred
16
8
  >>> df
17
- ph
9
+ pH
10
+ 0 1.0
11
+ 1 2.0
12
+ 2 NaN
13
+ 3 4.0
14
+ 4 NaN
15
+ 5 6.0
16
+ 6 NaN
17
+ >>> df.loc[df["pH"].isnull(), "pH"] = ph_pred
18
+ >>> df
19
+ pH
20
+ 0 1.00
21
+ 1 2.00
18
- 41 1.23
22
+ 2 1.23
23
+ 3 4.00
19
- 45 2.34
24
+ 4 2.34
25
+ 5 6.00
20
- 51 3.45
26
+ 6 3.45
21
- ```
27
+ ```
22
-
23
- データフレームの行数と配列の長さが一致していれば単に代入するだけで目的を達成できるかと。