回答編集履歴
2
追記
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
書き換え
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({"
|
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
|
-
|
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
|
-
|
22
|
+
2 1.23
|
23
|
+
3 4.00
|
19
|
-
|
24
|
+
4 2.34
|
25
|
+
5 6.00
|
20
|
-
|
26
|
+
6 3.45
|
21
|
-
```
|
27
|
+
```
|
22
|
-
|
23
|
-
データフレームの行数と配列の長さが一致していれば単に代入するだけで目的を達成できるかと。
|