質問編集履歴

14

説明追加

2020/10/17 10:37

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -160,6 +160,8 @@
160
160
 
161
161
 
162
162
 
163
+ ### 想定しているデータフレーム
164
+
163
165
  def dataset():
164
166
 
165
167
  mu, sigma = 0, (10-i)+1
@@ -196,6 +198,8 @@
196
198
 
197
199
 
198
200
 
201
+ ### 外れている値をNANへ変換する自作関数
202
+
199
203
  def remove_outlier(dataframe):
200
204
 
201
205
 
@@ -246,6 +250,8 @@
246
250
 
247
251
 
248
252
 
253
+ ### 自作関数処理した結果を表示したもの(期待している出力)
254
+
249
255
  print(remove_outlier(df).head(5))
250
256
 
251
257
 

13

追記

2020/10/17 10:37

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -145,3 +145,123 @@
145
145
  return new_df
146
146
 
147
147
  ```
148
+
149
+
150
+
151
+ ### 再度:追記
152
+
153
+ ```ここに言語を入力
154
+
155
+ import numpy as np
156
+
157
+ import pandas as pd
158
+
159
+ import random
160
+
161
+
162
+
163
+ def dataset():
164
+
165
+ mu, sigma = 0, (10-i)+1
166
+
167
+ data = np.array([[random.gauss(mu, sigma) for _ in range(500)],[random.gauss(mu, sigma) for _ in range(500)]])
168
+
169
+ dataframe=pd.DataFrame(data.T,columns=["A","B"])
170
+
171
+ dataframe.loc[1,"A"]=1000
172
+
173
+ dataframe.loc[3,"B"]=-1000
174
+
175
+ return dataframe
176
+
177
+
178
+
179
+ df=dataset()
180
+
181
+
182
+
183
+ print(df.head(5))
184
+
185
+ A B
186
+
187
+ 0 -16.397471 -15.766524
188
+
189
+ 1 1000.000000 -2.913148
190
+
191
+ 2 20.302729 -6.395709
192
+
193
+ 3 -6.314884 -1000.000000
194
+
195
+ 4 -5.692132 -2.014456
196
+
197
+
198
+
199
+ def remove_outlier(dataframe):
200
+
201
+
202
+
203
+ results_all=[]
204
+
205
+
206
+
207
+ for c in dataframe.columns:
208
+
209
+
210
+
211
+ q1 = dataframe[c].quantile(0.3)
212
+
213
+ q3 = dataframe[c].quantile(0.7)
214
+
215
+ iqr = q3 - q1
216
+
217
+ fence_low = q1-2*iqr
218
+
219
+ fence_high = q3+2*iqr
220
+
221
+
222
+
223
+ result=[]
224
+
225
+ for i,k in zip(range(len(dataframe)),[(dataframe[c] > fence_low) & (dataframe[c] < fence_high)][0].values):
226
+
227
+ if k==False:
228
+
229
+ result.append(np.nan)
230
+
231
+ else:
232
+
233
+ result.append(dataframe[c][i])
234
+
235
+
236
+
237
+ results_all.append(result)
238
+
239
+
240
+
241
+ new_df=pd.DataFrame(np.array(results_all).T)
242
+
243
+ new_df.columns = dataframe.columns
244
+
245
+ return new_df
246
+
247
+
248
+
249
+ print(remove_outlier(df).head(5))
250
+
251
+
252
+
253
+ A B
254
+
255
+ 0 -16.397471 -15.766524
256
+
257
+ 1 NaN -2.913148
258
+
259
+ 2 20.302729 -6.395709
260
+
261
+ 3 -6.314884 NaN
262
+
263
+ 4 -5.692132 -2.014456
264
+
265
+
266
+
267
+ ```

12

説明追加

2020/10/17 10:33

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,12 @@
7
7
  私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り(行方向ではない)、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値1000が入っていますが、数値1000はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
+
11
+
12
+
13
+ ### 動作を再現できるデータフレーム疑似生成 ###
14
+
15
+
10
16
 
11
17
  import numpy as np
12
18
 

11

説明を詳細にするため

2020/10/17 09:56

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,12 @@
7
7
  私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り(行方向ではない)、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値1000が入っていますが、数値1000はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
+
11
+ import numpy as np
12
+
13
+ import pandas as pd
14
+
15
+ import random
10
16
 
11
17
  mu, sigma = 0, (10-i)+1
12
18
 

10

正確な説明とするため

2020/10/17 08:26

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -4,47 +4,51 @@
4
4
 
5
5
  ### 想定していること
6
6
 
7
- 私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り(行方向ではない)、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値100が入っていますが、数値100はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
7
+ 私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り(行方向ではない)、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値1000が入っていますが、数値1000はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
10
 
11
- df_sample=pd.DataFrame(np.random.randn(100,2),columns=["A","B"])
11
+ mu, sigma = 0, (10-i)+1
12
12
 
13
- df_sample.loc[1,"A"]=100
13
+ data = np.array([[random.gauss(mu, sigma) for _ in range(500)],[random.gauss(mu, sigma) for _ in range(500)]])
14
14
 
15
+ df=pd.DataFrame(data.T,columns=["A","B"])
16
+
17
+ df.loc[1,"A"]=1000
18
+
15
- df_sample.loc[3,"B"]=-100
19
+ df.loc[3,"B"]=-1000
16
20
 
17
21
 
18
22
 
19
- A B
23
+ A B
20
24
 
21
- 0 -0.333351 1.263570
25
+ 0 -5.215559 15.548085
22
26
 
23
- 1 100.000000 -0.186901
27
+ 1 1000.000000 7.173219
24
28
 
25
- 2 0.052173 0.961346
29
+ 2 -8.806023 0.233582
26
30
 
27
- 3 0.467862 -100.000000
31
+ 3 -17.739273 -1000.000000
28
32
 
29
- 4 -0.396383 -0.521616
33
+ 4 3.270542 6.586852
30
34
 
31
35
  ... ... ...
32
36
 
33
- 95 1.050424 -0.552338
37
+ 495 18.536944 23.445213
34
38
 
35
- 96 0.081343 0.829180
39
+ 496 0.197173 8.680920
36
40
 
37
- 97 0.185609 -0.850662
41
+ 497 -8.324104 -4.110047
38
42
 
39
- 98 -0.711020 -0.572778
43
+ 498 1.917041 -8.685127
40
44
 
41
- 99 1.304891 -0.239319
45
+ 499 -8.054887 -11.455291
42
46
 
43
47
 
44
48
 
45
49
  ```
46
50
 
47
- ↓↓↓↓↓↓ 変換後
51
+ ↓↓↓↓↓↓ 変換後に期待している出力
48
52
 
49
53
  ```ここに言語を入力
50
54
 
@@ -52,27 +56,27 @@
52
56
 
53
57
  A B
54
58
 
55
- 0 -0.333351 1.263570
59
+ 0 -5.215559 15.548085
56
60
 
57
- 1 NaN -0.186901
61
+ 1 NAN 7.173219
58
62
 
59
- 2 0.052173 0.961346
63
+ 2 -8.806023 0.233582
60
64
 
61
- 3 0.467862 NaN
65
+ 3 -17.739273 NAN
62
66
 
63
- 4 -0.396383 -0.521616
67
+ 4 3.270542 6.586852
64
68
 
65
69
  ... ... ...
66
70
 
67
- 95 1.050424 -0.552338
71
+ 495 18.536944 23.445213
68
72
 
69
- 96 0.081343 0.829180
73
+ 496 0.197173 8.680920
70
74
 
71
- 97 0.185609 -0.850662
75
+ 497 -8.324104 -4.110047
72
76
 
73
- 98 -0.711020 -0.572778
77
+ 498 1.917041 -8.685127
74
78
 
75
- 99 1.304891 -0.239319
79
+ 499 -8.054887 -11.455291
76
80
 
77
81
  ```
78
82
 

9

説明不足のため

2020/10/17 08:21

投稿

mini1988
mini1988

スコア56

test CHANGED
@@ -1 +1 @@
1
- [python]同一カラム内の全データから成る分布から外れるデータをNaNに置換した形で返すコードをスマートに書けずに悩んでいます
1
+ [python]データフレームの同一カラム内の全データから成る分布から外れるデータをNaNに置換した形で返すコードをスマートに書けずに悩んでいます
test CHANGED
File without changes

8

説明不足のため

2020/10/17 05:29

投稿

mini1988
mini1988

スコア56

test CHANGED
@@ -1 +1 @@
1
- [python]分布から外れるデータをNaNに置換した形で返すコードをスマートに書けずに悩んでいます
1
+ [python]同一のカラム内の全データから成る分布から外れるデータをNaNに置換した形で返すコードをスマートに書けずに悩んでいます
test CHANGED
File without changes

7

日本語修正

2020/10/17 04:58

投稿

mini1988
mini1988

スコア56

test CHANGED
@@ -1 +1 @@
1
- [python]分布から外れるデータを除去した形で返すコードをスマートに書けずに悩んでいます
1
+ [python]分布から外れるデータをNaNに置換した形で返すコードをスマートに書けずに悩んでいます
test CHANGED
File without changes

6

日本語修正

2020/10/17 04:57

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 想定していること
6
6
 
7
- 私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値100が入っていますが、数値100はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
7
+ 私がやりたいのは、「同一のカラムの中にある全データに対して分布を取り(行方向ではない)、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値100が入っていますが、数値100はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
10
 

5

日本語修正

2020/10/16 19:37

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -16,29 +16,29 @@
16
16
 
17
17
 
18
18
 
19
- A B
19
+ A B
20
20
 
21
- 0 1.402943 0.957398
21
+ 0 -0.333351 1.263570
22
22
 
23
- 1 100.000000 -0.491958
23
+ 1 100.000000 -0.186901
24
24
 
25
- 2 -1.118389 0.610830
25
+ 2 0.052173 0.961346
26
26
 
27
- 3 -0.792542 -100.000000
27
+ 3 0.467862 -100.000000
28
28
 
29
- 4 0.293564 -0.986364
29
+ 4 -0.396383 -0.521616
30
30
 
31
31
  ... ... ...
32
32
 
33
- 95 2.276311 1.370300
33
+ 95 1.050424 -0.552338
34
34
 
35
- 96 -0.936119 -1.375171
35
+ 96 0.081343 0.829180
36
36
 
37
- 97 0.182193 -0.479364
37
+ 97 0.185609 -0.850662
38
38
 
39
- 98 0.162169 0.398542
39
+ 98 -0.711020 -0.572778
40
40
 
41
- 99 -2.532987 0.727212
41
+ 99 1.304891 -0.239319
42
42
 
43
43
 
44
44
 

4

説明補足

2020/10/16 19:36

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,37 @@
44
44
 
45
45
  ```
46
46
 
47
+ ↓↓↓↓↓↓ 変換後
47
48
 
49
+ ```ここに言語を入力
50
+
51
+
52
+
53
+ A B
54
+
55
+ 0 -0.333351 1.263570
56
+
57
+ 1 NaN -0.186901
58
+
59
+ 2 0.052173 0.961346
60
+
61
+ 3 0.467862 NaN
62
+
63
+ 4 -0.396383 -0.521616
64
+
65
+ ... ... ...
66
+
67
+ 95 1.050424 -0.552338
68
+
69
+ 96 0.081343 0.829180
70
+
71
+ 97 0.185609 -0.850662
72
+
73
+ 98 -0.711020 -0.572778
74
+
75
+ 99 1.304891 -0.239319
76
+
77
+ ```
48
78
 
49
79
  ### 私が書いた自作コード
50
80
 

3

日本語誤記修正

2020/10/16 19:36

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 想定していること
6
6
 
7
- 私がやりたいのは、「同一のカラムの中にあるデータに対して分布を取り、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、Aのインデックス1に数値100が入っていますが、数値100はA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
7
+ 私がやりたいのは、「同一のカラムの中にあるデータに対して分布を取り、その分布から外れるデータの箇所をNANに置換して返す」というものです。以下の場合だと、カラムAのインデックス1に数値100が入っていますが、数値100はカラムA全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
10
 

2

日本語修正

2020/10/16 19:32

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 想定していること
6
6
 
7
- 私がやりたいのは、カラム方向に対して分布を確認してその分布から外れるデータの部分をNANに置換して返すというものです。以下の場合だと、A列のインデックス1に数値100が入っていますが、100はA列からなる分布から外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理をたい。
7
+ 私がやりたいのは、「同一のカラムの中あるデータに対して分布を取り、その分布から外れるデータの箇所をNANに置換して返すというものです。以下の場合だと、A列のインデックス1に数値100が入っていますが、数値100はA列全体のデータ分布からある一定の条件を持って外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理を行いたい。
8
8
 
9
9
  ```ここに言語を入力
10
10
 

1

明確な説明をするため修正

2020/10/16 19:29

投稿

mini1988
mini1988

スコア56

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,50 @@
1
1
  ### 困っていること
2
2
 
3
3
  データフレームの各列に対して分布から外れるデータを除去した形で返したくて、自作で関数を作りました。所望の動作はするのですが、冗長な感じが抜けず、もっとスマートなコードにしたいと考えています。おそらく、lambda, map(), apply(), applymap()などを使って、やることになるのかなとも思うのですが、なかなか書けません。どなたか、もっとシンプルにスマートなコードを書く方法を教えていただけないでしょうか?お手数ですが、よろしくお願いします。
4
+
5
+ ### 想定していること
6
+
7
+ 私がやりたいのは、カラム方向に対して分布を確認してその分布から外れるデータの部分をNANに置換して返す、というものです。以下の場合だと、A列のインデックス1に数値100が入っていますが、100はA列からなる分布から外れているのでその部分をNANにする、という処理を行いたいです。他のカラム(B列,C列,,,)も同様の処理をしたい。
8
+
9
+ ```ここに言語を入力
10
+
11
+ df_sample=pd.DataFrame(np.random.randn(100,2),columns=["A","B"])
12
+
13
+ df_sample.loc[1,"A"]=100
14
+
15
+ df_sample.loc[3,"B"]=-100
16
+
17
+
18
+
19
+ A B
20
+
21
+ 0 1.402943 0.957398
22
+
23
+ 1 100.000000 -0.491958
24
+
25
+ 2 -1.118389 0.610830
26
+
27
+ 3 -0.792542 -100.000000
28
+
29
+ 4 0.293564 -0.986364
30
+
31
+ ... ... ...
32
+
33
+ 95 2.276311 1.370300
34
+
35
+ 96 -0.936119 -1.375171
36
+
37
+ 97 0.182193 -0.479364
38
+
39
+ 98 0.162169 0.398542
40
+
41
+ 99 -2.532987 0.727212
42
+
43
+
44
+
45
+ ```
46
+
47
+
4
48
 
5
49
  ### 私が書いた自作コード
6
50