質問編集履歴
1
欠損を補う手法の解説追加,コメント挿入,実行結果追加
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)==
|
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)==
|
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で置き換えてみたら,正常に回りました.
|