回答編集履歴

2

d

2019/08/26 08:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,14 +1,14 @@
1
- Series.where をお使いください。
1
+ Series.mask をお使いください。
2
2
 
3
3
 
4
4
 
5
- [pandas.Series.where — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.where.html)
5
+ [pandas.Series.mask — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.mask.html)
6
6
 
7
7
 
8
8
 
9
- Series.where(条件式, 置き換える値) で「条件式」が False の要素を「置き換える値」で置換できます。
9
+ Series.mask(条件式, 置き換える値) で「条件式」が True の要素を「置き換える値」で置換できます。
10
10
 
11
- 今回の場合、値が0の要素を置き換えたいとのことなので、条件式を `df["kangoshokuin_jokinkansan"] != 0` とすることで、この条件式が False になる要素、つまり、値が0の要素は列 `kangoshokuin_jokinkasan_estimation` の値で置き換えられます。
11
+ 今回の場合、列 `kangoshokuin_jokinkansan` の値が0の要素を置き換えたいとのことなので、条件式を `df["kangoshokuin_jokinkansan"] == 0` とすることで、この条件式が True になる要素、つまり、値が0の要素は列 `kangoshokuin_jokinkasan_estimation` の値で置き換えられます。
12
12
 
13
13
 
14
14
 
@@ -46,9 +46,9 @@
46
46
 
47
47
  # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
48
48
 
49
- df["kangoshokuin_jokinkansan"].where(
49
+ df["kangoshokuin_jokinkansan"].mask(
50
50
 
51
- df["kangoshokuin_jokinkansan"] != 0,
51
+ df["kangoshokuin_jokinkansan"] == 0,
52
52
 
53
53
  df["kangoshokuin_jokinkasan_estimation"],
54
54
 
@@ -110,9 +110,9 @@
110
110
 
111
111
  # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
112
112
 
113
- df["kangoshokuin_jokinkansan"].where(
113
+ df["kangoshokuin_jokinkansan"].mask(
114
114
 
115
- ~np.isclose(df["kangoshokuin_jokinkansan"], 0),
115
+ np.isclose(df["kangoshokuin_jokinkansan"], 0),
116
116
 
117
117
  df["kangoshokuin_jokinkasan_estimation"],
118
118
 

1

d

2019/08/26 08:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -59,3 +59,67 @@
59
59
  print(df)
60
60
 
61
61
  ```
62
+
63
+
64
+
65
+ ## 補足
66
+
67
+
68
+
69
+ ちなみに `kangoshokuin_jokinkansan` の値がなんらかの演算結果として算出された値である場合、数値計算は丸め誤差が発生するので、理論上0になるはずでも通常は厳密に0にはなりません。
70
+
71
+ そのため、浮動小数点数同士の値の比較は numpy.isclose を使うほうが好ましいです。
72
+
73
+
74
+
75
+ [numpy.isclose — NumPy v1.15 Manual](https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.isclose.html)
76
+
77
+
78
+
79
+ ```python
80
+
81
+ import pandas as pd
82
+
83
+
84
+
85
+ df = pd.DataFrame(
86
+
87
+ {
88
+
89
+ "jigyosho_id": [0, 1, 21],
90
+
91
+ "kangoshokuin_jokinkansan": [1, 0.954538, 0],
92
+
93
+ "kangoshokuin_jokinkasan_estimation": [2.859272, 0.318179, 1.319],
94
+
95
+ }
96
+
97
+ )
98
+
99
+ print(df)
100
+
101
+ # jigyosho_id kangoshokuin_jokinkansan kangoshokuin_jokinkasan_estimation
102
+
103
+ # 0 0 1.000000 2.859272
104
+
105
+ # 1 1 0.954538 0.318179
106
+
107
+ # 2 21 0.000000 1.319000
108
+
109
+
110
+
111
+ # 列 kangoshokuin_jokinkansan の値が0の要素は列 kangoshokuin_jokinkasan_estimation の値で置き換える。
112
+
113
+ df["kangoshokuin_jokinkansan"].where(
114
+
115
+ ~np.isclose(df["kangoshokuin_jokinkansan"], 0),
116
+
117
+ df["kangoshokuin_jokinkasan_estimation"],
118
+
119
+ inplace=True,
120
+
121
+ )
122
+
123
+ print(df)
124
+
125
+ ```