質問編集履歴

1

欠損を補う手法の解説追加,コメント挿入,実行結果追加

2018/12/14 01:33

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 欠損を補うプログラムを作成しています.dfの7行5列の要素2と9行5列の要素6をfor文の外で計算すると計算できるのに,for文内の★の位置で計算するとNaNになります.これはなぜこうなってしまうのでしょうか?
1
+ e列以降の欠損をある条件の元,補うプログラムを作成しています.dfの7行5列の要素2と9行5列の要素6をfor文の外で計算すると計算できるのに,for文内の★の位置で計算するとNaNになります.これはなぜこうなってしまうのでしょうか?
2
2
 
3
3
  また,配列の大きさは変えていない(つもり)ですが,下記のエラーが発生するのはなぜなのでしょうか?
4
4
 
@@ -6,6 +6,76 @@
6
6
 
7
7
 
8
8
 
9
+ <条件>
10
+
11
+ - 埋める対象となるセルの条件(例:index=2のe列が対象か調べる場合)
12
+
13
+ 0. 欠損しているセルの行のa列要素と同じ値を持つ行がdfにある
14
+
15
+ (index=1~7が該当)
16
+
17
+ 0. 欠損しているセルのb列の要素と同じ要素をc列に持ち,1.を満たす行がdfにあること.
18
+
19
+ (index=1の行が該当)
20
+
21
+ 0. 欠損しているセルのc列の要素と同じ要素をb列に持ち,1.を満たす行がdfにあること.
22
+
23
+ (index=3と4の行が該当)
24
+
25
+ 0. 2.3.で該当した行が欠損しているセルの列と同じ列に要素がある
26
+
27
+ (index=1,3,4のe列には要素があるため,index=2のe列の欠損は埋める対象となる)
28
+
29
+ 以上の条件を満たさないセルは,dfでは欠損のままになる
30
+
31
+
32
+
33
+ <埋め方>
34
+
35
+ 条件2,3で該当した行の欠損しているセルの列と同じ列の要素で調和平均した値を,条件4で決定した欠損しているセルに入れる.
36
+
37
+ ここで,条件2,3で該当した行が,それぞれの条件で2行以上ある場合は,欠損しているセルの行のd列(角度)を基準にして角度の差が絶対値で小さい方を採用する.
38
+
39
+ (条件3では2行該当しているため,index=2のd列を基準としてindex=3,4の角度差を見る.index=4の角度差の方が小さいため,index=4を採用し,index=1,4のe列の調和平均値で欠損を埋める)
40
+
41
+
42
+
43
+ **理想の実行結果**
44
+
45
+ index|a|b|c|d|e|f
46
+
47
+ |:--|:--:|--:|:--|:--:|--:|
48
+
49
+ 1|45|1|2|0|2|2|
50
+
51
+ 2|45|2|3|0|2.4|2.6|
52
+
53
+ 3|45|3|4|10|5|5|
54
+
55
+ 4|45|3|6|358|3|4|
56
+
57
+ 5|45|4|5|0|2|2|
58
+
59
+ 6|45|5|6|0|3|nan|
60
+
61
+ 7|45|7|8|0|5|5|
62
+
63
+ 8|35|2|3|10|nan|2|
64
+
65
+ 9|35|3|4|10|nan|3|
66
+
67
+ 10|35|4|5|10|5|6|
68
+
69
+ 11|35|5|7|20|2|2|
70
+
71
+ 12|35|6|7|20|nan|nan|
72
+
73
+ 13|35|7|8|15|5|5|
74
+
75
+ 14|25|1|2|6|nan|5|
76
+
77
+
78
+
9
79
  ```python
10
80
 
11
81
  import pandas as pd
@@ -48,86 +118,122 @@
48
118
 
49
119
 
50
120
 
51
- for n in range(info,col):
121
+ for n in range(info,col):#dfの列数分ループ
52
-
122
+
53
- k=df[df[collist[n]].isnull()]
123
+ k=df[df[collist[n]].isnull()]#欠損している行だけ抽出
54
124
 
55
125
  k_index=k.index.values
56
126
 
57
127
 
58
128
 
59
- for i in range(len(k)):
129
+ for i in range(len(k)):#欠損している行分ループ
60
-
130
+
61
- if df[(df["a"]==k.iloc[i,A])&(df["c"]==k.iloc[i,B])].empty:
131
+ if df[(df["a"]==k.iloc[i,A])&(df["c"]==k.iloc[i,B])].empty:#条件2を満たさなければ次のループへ
62
132
 
63
133
  continue
64
134
 
65
- m=df[(df["a"]==k.iloc[i,A])&(df["c"]==k.iloc[i,B])]
135
+ m=df[(df["a"]==k.iloc[i,A])&(df["c"]==k.iloc[i,B])]#条件2に該当する行
66
136
 
67
137
 
68
138
 
69
- if len(m)==0:
139
+ if len(m)==1:
70
-
71
- mae=pd.DataFrame([None,None,None,None,None,None],columns=collist)
72
-
73
- elif len(m)==1:
74
140
 
75
141
  mae=m
76
142
 
77
143
  else:
78
144
 
79
- mk=[]
145
+ mk=[]#条件2に該当した行の角度の差を格納
80
146
 
81
147
  for x in range(len(m)):
82
148
 
83
149
  mk.append(min(abs(m.iloc[x,kakudo]-k.iloc[i,kakudo]),360-m.iloc[x,kakudo]+k.iloc[i,kakudo]))
84
150
 
85
- mae=m.iloc[mk.index(min(mk)),:]
151
+ mae=m.iloc[mk.index(min(mk)),:]#埋め方の「ここで~」の部分.これで,条件2に該当する行の抽出完了
86
152
 
87
153
 
88
154
 
89
155
 
90
156
 
91
- if df[(df["a"]==k.iloc[i,A])&(df["b"]==k.iloc[i,C])].empty:
157
+ if df[(df["a"]==k.iloc[i,A])&(df["b"]==k.iloc[i,C])].empty:#条件3を満たさなければ次のループへ
92
158
 
93
159
  continue
94
160
 
95
- u=df[(df["a"]==k.iloc[i,A])&(df["b"]==k.iloc[i,C])]
161
+ u=df[(df["a"]==k.iloc[i,A])&(df["b"]==k.iloc[i,C])]#条件3に該当する行
96
162
 
97
163
 
98
164
 
99
- if len(u)==0:
165
+ if len(u)==1:
100
-
101
- ushiro=pd.DataFrame([None,None,None,None,None,None],columns=collist)
102
-
103
- elif len(u)==1:
104
166
 
105
167
  ushiro=u
106
168
 
107
169
  else:
108
170
 
109
- uk=[]
171
+ uk=[]#条件3に該当した行の角度の差を格納
110
172
 
111
173
  for y in range(len(u)):
112
174
 
113
175
  uk.append(min(abs(u.iloc[y,kakudo]-k.iloc[i,kakudo]),360-u.iloc[y,kakudo]+k.iloc[i,kakudo]))
114
176
 
115
- ushiro=u.iloc[uk.index(min(uk)),:]
177
+ ushiro=u.iloc[uk.index(min(uk)),:]]#埋め方の「ここで~」の部分.これで,条件2に該当する行の抽出完了
116
178
 
117
179
 
118
180
 
119
- if math.isnan(mae[collist[n]]) or math.isnan(ushiro[collist[n]]):
181
+ if math.isnan(mae[collist[n]]) or math.isnan(ushiro[collist[n]]):条件4を満たさない場合は次のループへ
120
182
 
121
183
  continue
122
184
 
123
185
  else:
124
186
 
125
- df.at[k_index[i],collist[n]]=2/(1/mae[collist[n]]+1/ushiro[collist[n]])##
187
+ df.at[k_index[i],collist[n]]=2/(1/mae[collist[n]]+1/ushiro[collist[n]])#★,埋め方
126
188
 
127
189
  print(df)
128
190
 
129
191
  ```
130
192
 
193
+ **コードの実行結果**
194
+
195
+ index|a|b|c|d|e|f
196
+
197
+ |:--|:--:|--:|:--|:--:|--:|
198
+
199
+ 1|45|1|2|0|2|2|
200
+
201
+ 2|45|2|3|0|2.4|2.6|
202
+
203
+ 3|45|3|4|10|5|5|
204
+
205
+ 4|45|3|6|358|3|4|
206
+
207
+ 5|45|4|5|0|2|2|
208
+
209
+ 6|45|5|6|0|3|nan|
210
+
211
+ 7|45|7|8|0|5|5|
212
+
213
+ 8|35|2|3|10|nan|2|
214
+
215
+ 9|35|3|4|10|nan|nan|
216
+
217
+ 10|35|4|5|10|5|6|
218
+
219
+ 11|35|5|7|20|2|2|
220
+
221
+ 12|35|6|7|20|nan|nan|
222
+
223
+ 13|35|7|8|15|5|5|
224
+
225
+ 14|25|1|2|6|nan|5|
226
+
227
+
228
+
229
+ index=6,f列の欠損までは処理できているが,index=9,f列の計算結果がnanになり,下記のエラーが発生する.
230
+
131
231
  ###エラーコード
132
232
 
133
233
  setting an array element with a sequence.
234
+
235
+
236
+
237
+ ###試したこと
238
+
239
+ ★部分で計算結果で置き換えするのではなく,試しに100で置き換えてみたら,正常に回りました.