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

回答編集履歴

2

d

2019/08/26 08:13

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -1,9 +1,9 @@
1
- Series.where をお使いください。
1
+ Series.mask をお使いください。
2
2
 
3
- [pandas.Series.where — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.where.html)
3
+ [pandas.Series.mask — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.mask.html)
4
4
 
5
- Series.where(条件式, 置き換える値) で「条件式」が False の要素を「置き換える値」で置換できます。
5
+ Series.mask(条件式, 置き換える値) で「条件式」が True の要素を「置き換える値」で置換できます。
6
- 今回の場合、値が0の要素を置き換えたいとのことなので、条件式を `df["kangoshokuin_jokinkansan"] != 0` とすることで、この条件式が False になる要素、つまり、値が0の要素は列 `kangoshokuin_jokinkasan_estimation` の値で置き換えられます。
6
+ 今回の場合、列 `kangoshokuin_jokinkansan` の値が0の要素を置き換えたいとのことなので、条件式を `df["kangoshokuin_jokinkansan"] == 0` とすることで、この条件式が True になる要素、つまり、値が0の要素は列 `kangoshokuin_jokinkasan_estimation` の値で置き換えられます。
7
7
 
8
8
  ```python
9
9
  import pandas as pd
@@ -22,8 +22,8 @@
22
22
  # 2 21 0.000000 1.319000
23
23
 
24
24
  # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
25
- df["kangoshokuin_jokinkansan"].where(
25
+ df["kangoshokuin_jokinkansan"].mask(
26
- df["kangoshokuin_jokinkansan"] != 0,
26
+ df["kangoshokuin_jokinkansan"] == 0,
27
27
  df["kangoshokuin_jokinkasan_estimation"],
28
28
  inplace=True,
29
29
  )
@@ -54,8 +54,8 @@
54
54
  # 2 21 0.000000 1.319000
55
55
 
56
56
  # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
57
- df["kangoshokuin_jokinkansan"].where(
57
+ df["kangoshokuin_jokinkansan"].mask(
58
- ~np.isclose(df["kangoshokuin_jokinkansan"], 0),
58
+ np.isclose(df["kangoshokuin_jokinkansan"], 0),
59
59
  df["kangoshokuin_jokinkasan_estimation"],
60
60
  inplace=True,
61
61
  )

1

d

2019/08/26 08:13

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -28,4 +28,36 @@
28
28
  inplace=True,
29
29
  )
30
30
  print(df)
31
+ ```
32
+
33
+ ## 補足
34
+
35
+ ちなみに `kangoshokuin_jokinkansan` の値がなんらかの演算結果として算出された値である場合、数値計算は丸め誤差が発生するので、理論上0になるはずでも通常は厳密に0にはなりません。
36
+ そのため、浮動小数点数同士の値の比較は numpy.isclose を使うほうが好ましいです。
37
+
38
+ [numpy.isclose — NumPy v1.15 Manual](https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.isclose.html)
39
+
40
+ ```python
41
+ import pandas as pd
42
+
43
+ df = pd.DataFrame(
44
+ {
45
+ "jigyosho_id": [0, 1, 21],
46
+ "kangoshokuin_jokinkansan": [1, 0.954538, 0],
47
+ "kangoshokuin_jokinkasan_estimation": [2.859272, 0.318179, 1.319],
48
+ }
49
+ )
50
+ print(df)
51
+ # jigyosho_id kangoshokuin_jokinkansan kangoshokuin_jokinkasan_estimation
52
+ # 0 0 1.000000 2.859272
53
+ # 1 1 0.954538 0.318179
54
+ # 2 21 0.000000 1.319000
55
+
56
+ # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
57
+ df["kangoshokuin_jokinkansan"].where(
58
+ ~np.isclose(df["kangoshokuin_jokinkansan"], 0),
59
+ df["kangoshokuin_jokinkasan_estimation"],
60
+ inplace=True,
61
+ )
62
+ print(df)
31
63
  ```