回答編集履歴

2

追記

2020/01/19 17:39

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -51,3 +51,49 @@
51
51
  6 3.45
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ---
58
+
59
+
60
+
61
+ > また
62
+
63
+ > ```python
64
+
65
+ > df[df['pH'].isnull()]["pH"]=pH_pred
66
+
67
+ > ```
68
+
69
+ > で予測値を代入しようとして、エラーが出ないのに代入されていないのもわかりません。
70
+
71
+
72
+
73
+ 私の環境では警告が出ました。
74
+
75
+
76
+
77
+ ```python
78
+
79
+ >>> df[df['pH'].isnull()]["pH"]=ph_pred
80
+
81
+ __main__:1: SettingWithCopyWarning:
82
+
83
+ A value is trying to be set on a copy of a slice from a DataFrame.
84
+
85
+ Try using .loc[row_indexer,col_indexer] = value instead
86
+
87
+
88
+
89
+ See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
90
+
91
+ ```
92
+
93
+
94
+
95
+ pandasのcopyとview関連の挙動については私も全貌を把握しきれていないので、詳細な説明は警告に示されているリファレンスに譲りたいと思います。
96
+
97
+
98
+
99
+ 結論としては、locやilocを使って代入すれば問題ないです。

1

書き換え

2020/01/19 17:39

投稿

hayataka2049
hayataka2049

スコア30933

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