質問編集履歴

5

コードの修正

2018/12/13 04:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -186,7 +186,7 @@
186
186
 
187
187
  for x in range(len(m)):
188
188
 
189
- mk.append(min(abs(m.iloc[x,kakudo]-ketu.iloc[i,kakudo]),360-m.iloc[x,kakudo]+k.iloc[i,kakudo]))
189
+ mk.append(min(abs(m.iloc[x,kakudo]-k.iloc[i,kakudo]),360-m.iloc[x,kakudo]+k.iloc[i,kakudo]))
190
190
 
191
191
  mae=m.iloc[mk.index(min(mk)),:]
192
192
 

4

2018/12/13 04:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  1|45|1|2|0|2|2|
88
88
 
89
- 2|45|2|3|0|2.5|2.5|
89
+ 2|45|2|3|0|2.4|2.4|
90
90
 
91
91
  3|45|3|4|10|5|5|
92
92
 
@@ -100,7 +100,7 @@
100
100
 
101
101
  8|35|2|3|10|nan|2|
102
102
 
103
- 9|35|3|4|10|nan|3.5|
103
+ 9|35|3|4|10|nan|2.9|
104
104
 
105
105
  10|35|4|5|10|5|5|
106
106
 

3

2018/12/13 03:11

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,79 @@
4
4
 
5
5
 
6
6
 
7
- 実現したいことは,dfのd列以降の欠損を以下の条件の元,埋めた新しいデータフレームdf1を作成したいです
7
+ 実現したいことは,df1のd列以降の欠損を以下の条件の元,埋めた新しいデータフレームdfを作成したいです
8
-
8
+
9
- dfのa列はレイヤーの番号,b,c列は地点番号(b,cを結ぶと直線が表現できる),d列は角度,e列以降はbc間の情報が入っています.
9
+ df1のa列はレイヤーの番号,b,c列は地点番号(b,cを結ぶと直線が表現できる),d列は角度,e列以降はbc間の情報が入っています.
10
+
11
+ df1
12
+
13
+ index|a|b|c|d|e|f
14
+
15
+ |:--|:--:|--:|:--|:--:|--:|
16
+
17
+ 1|45|1|2|0|2|2|
18
+
19
+ 2|45|2|3|0|nan|nan|
20
+
21
+ 3|45|3|4|10|5|5|
22
+
23
+ 4|45|3|6|358|3|3|
24
+
25
+ 5|45|4|5|0|2|2|
26
+
27
+ 6|45|5|6|0|3|nan|
28
+
29
+ 7|45|7|8|0|5|5|
30
+
31
+ 8|35|2|3|10|nan|2|
32
+
33
+ 9|35|3|4|10|nan|nan|
34
+
35
+ 10|35|4|5|10|5|5|
36
+
37
+ 11|35|5|7|20|2|2|
38
+
39
+ 12|35|6|7|20|nan|nan|
40
+
41
+ 13|35|7|8|15|5|5|
42
+
43
+ 14|25|1|2|6|nan|5|
44
+
45
+
46
+
47
+ <条件>
48
+
49
+ - 埋める対象となるセルの条件(例:index=2のe列が対象か調べる場合)
50
+
51
+ 0. 欠損しているセルの行のa列要素と同じ値を持つ行がdfにある
52
+
53
+ (index=1~7が該当)
54
+
55
+ 0. 欠損しているセルのb列の要素と同じ要素をc列に持ち,1.を満たす行がdfにあること.
56
+
57
+ (index=1の行が該当)
58
+
59
+ 0. 欠損しているセルのc列の要素と同じ要素をb列に持ち,1.を満たす行がdfにあること.
60
+
61
+ (index=3と4の行が該当)
62
+
63
+ 0. 2.3.で該当した行が欠損しているセルの列と同じ列に要素がある
64
+
65
+ (index=1,3,4のe列には要素があるため,index=2のe列の欠損は埋める対象となる)
66
+
67
+ 以上の条件を満たさないセルは,dfでは欠損のままになる
68
+
69
+
70
+
71
+ <埋め方>
72
+
73
+ 条件2,3で該当した行の欠損しているセルの列と同じ列の要素で平均した値を,条件4で決定した欠損しているセルに入れる.
74
+
75
+ ここで,条件2,3で該当した行が,それぞれの条件で2行以上ある場合は,欠損しているセルの行のd列(角度)を基準にして角度の差が絶対値で小さい方を採用する.
76
+
77
+ (条件3では2行該当しているため,index=2のd列を基準としてindex=3,4の角度差を見る.index=4の角度差の方が小さいため,index=4を採用し,index=1,4のe列の平均値で欠損を埋める)
78
+
79
+
10
80
 
11
81
  df
12
82
 
@@ -16,7 +86,7 @@
16
86
 
17
87
  1|45|1|2|0|2|2|
18
88
 
19
- 2|45|2|3|0|nan|nan|
89
+ 2|45|2|3|0|2.5|2.5|
20
90
 
21
91
  3|45|3|4|10|5|5|
22
92
 
@@ -30,7 +100,7 @@
30
100
 
31
101
  8|35|2|3|10|nan|2|
32
102
 
33
- 9|35|3|4|10|nan|nan|
103
+ 9|35|3|4|10|nan|3.5|
34
104
 
35
105
  10|35|4|5|10|5|5|
36
106
 
@@ -44,76 +114,6 @@
44
114
 
45
115
 
46
116
 
47
- <条件>
48
-
49
- - 埋める対象となるセルの条件(例:index=2のe列が対象か調べる場合)
50
-
51
- 0. 欠損しているセルの行のa列要素と同じ値を持つ行がdfにある
52
-
53
- (index=1~7が該当)
54
-
55
- 0. 欠損しているセルのb列の要素と同じ要素をc列に持ち,1.を満たす行がdfにあること.
56
-
57
- (index=1の行が該当)
58
-
59
- 0. 欠損しているセルのc列の要素と同じ要素をb列に持ち,1.を満たす行がdfにあること.
60
-
61
- (index=3と4の行が該当)
62
-
63
- 0. 2.3.で該当した行が欠損しているセルの列と同じ列に要素がある
64
-
65
- (index=1,3,4のe列には要素があるため,index=2のe列の欠損は埋める対象となる)
66
-
67
- 以上の条件を満たさないセルは,df1では欠損のままになる
68
-
69
-
70
-
71
- <埋め方>
72
-
73
- 条件2,3で該当した行の欠損しているセルの列と同じ列の要素で平均した値を,条件4で決定した欠損しているセルに入れる.
74
-
75
- ここで,条件2,3で該当した行が,それぞれの条件で2行以上ある場合は,欠損しているセルの行のd列(角度)を基準にして角度の差が絶対値で小さい方を採用する.
76
-
77
- (条件3では2行該当しているため,index=2のd列を基準としてindex=3,4の角度差を見る.index=4の角度差の方が小さいため,index=4を採用し,index=1,4のe列の平均値で欠損を埋める)
78
-
79
-
80
-
81
- df1
82
-
83
- index|a|b|c|d|e|f
84
-
85
- |:--|:--:|--:|:--|:--:|--:|
86
-
87
- 1|45|1|2|0|2|2|
88
-
89
- 2|45|2|3|0|2.5|2.5|
90
-
91
- 3|45|3|4|10|5|5|
92
-
93
- 4|45|3|6|358|3|3|
94
-
95
- 5|45|4|5|0|2|2|
96
-
97
- 6|45|5|6|0|3|nan|
98
-
99
- 7|45|7|8|0|5|5|
100
-
101
- 8|35|2|3|10|nan|2|
102
-
103
- 9|35|3|4|10|nan|3.5|
104
-
105
- 10|35|4|5|10|5|5|
106
-
107
- 11|35|5|7|20|2|2|
108
-
109
- 12|35|6|7|20|nan|nan|
110
-
111
- 13|35|7|8|15|5|5|
112
-
113
- 14|25|1|2|6|nan|5|
114
-
115
-
116
-
117
117
  ```python
118
118
 
119
119
  import pandas as pd

2

2018/12/13 02:05

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -162,7 +162,7 @@
162
162
 
163
163
 
164
164
 
165
- for i in range(len(ketu)):#kを1行ずつ処理
165
+ for i in range(len(k)):#kを1行ずつ処理
166
166
 
167
167
  if df[(df["A"]==k.iloc[i,A])&(df["C"]==k.iloc[i,B])].empty:
168
168
 

1

質問の変更,コードの追加

2018/12/13 01:59

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 現在,ある条件の元,列毎に欠損を埋めるプログラムを作成したいのですが,ようなコードを書けば望み通り処理できるか全く分かりません.不躾で申し訳ございませんが,ご教授お願いいたします.
3
+ 現在,ある条件の元,列毎に欠損を埋めるプログラムを作成しています.計算結果がnanになっ場合,欠損は埋めずに次のループに行きたいのですが,方法が分かりません.不躾で申し訳ございませんが,ご教授お願いいたします.
4
4
 
5
5
 
6
6
 
@@ -111,3 +111,129 @@
111
111
  13|35|7|8|15|5|5|
112
112
 
113
113
  14|25|1|2|6|nan|5|
114
+
115
+
116
+
117
+ ```python
118
+
119
+ import pandas as pd
120
+
121
+
122
+
123
+ df1=pd.DataFrame([[45,1,2,0,2,2],[45,2,3,0,None,None],[45,3,4,10,5,5],[45,3,6,358,3,3],
124
+
125
+ [45,4,5,0,2,2],[45,5,6,0,3,None],[45,7,8,0,5,5],
126
+
127
+ [35,2,3,10,None,2],[35,3,4,10,None,None],[35,4,5,10,5,5],
128
+
129
+ [35,5,7,20,2,2],[35,6,7,20,None,None],[35,7,8,15,5,5],
130
+
131
+ [25,1,2,6,None,5]],columns=["A","B","C","D","E","F"])
132
+
133
+
134
+
135
+ df=df1.copy()
136
+
137
+
138
+
139
+ collist=df.columns.tolist()
140
+
141
+ col=len(df.columns)
142
+
143
+ info = df.columns.get_loc("E")
144
+
145
+
146
+
147
+ A=collist.index("A")
148
+
149
+ B=collist.index("B")
150
+
151
+ C=collist.index("C")
152
+
153
+ kakudo=collist.index("D")
154
+
155
+
156
+
157
+ for n in range(info,col):#dfを1列ずつ処理
158
+
159
+ k=df[df[collist[n]].isnull()]
160
+
161
+ k_index=k.index.values
162
+
163
+
164
+
165
+ for i in range(len(ketu)):#kを1行ずつ処理
166
+
167
+ if df[(df["A"]==k.iloc[i,A])&(df["C"]==k.iloc[i,B])].empty:
168
+
169
+ continue
170
+
171
+ m=df[(df["A"]==k.iloc[i,A])&(df["C"]==k.iloc[i,B])]
172
+
173
+
174
+
175
+ if len(m)==0:
176
+
177
+ mae=pd.DataFrame([None,None,None,None,None,None],columns=collist)
178
+
179
+ elif len(m)==1:
180
+
181
+ mae=m
182
+
183
+ else:
184
+
185
+ mk=[]
186
+
187
+ for x in range(len(m)):
188
+
189
+ mk.append(min(abs(m.iloc[x,kakudo]-ketu.iloc[i,kakudo]),360-m.iloc[x,kakudo]+k.iloc[i,kakudo]))
190
+
191
+ mae=m.iloc[mk.index(min(mk)),:]
192
+
193
+
194
+
195
+ if df[(df["A"]==k.iloc[i,A])&(df["B"]==k.iloc[i,C])].empty:
196
+
197
+ continue
198
+
199
+ u=df[(df["A"]==k.iloc[i,A])&(df["B"]==k.iloc[i,C])]
200
+
201
+
202
+
203
+ if len(u)==0:
204
+
205
+ ushiro=pd.DataFrame([None,None,None,None,None,None],columns=collist)
206
+
207
+ elif len(u)==1:
208
+
209
+ ushiro=u
210
+
211
+ else:
212
+
213
+ uk=[]
214
+
215
+ for y in range(len(u)):
216
+
217
+ uk.append(min(abs(u.iloc[y,kakudo]-k.iloc[i,kakudo]),360-u.iloc[y,kakudo]+k.iloc[i,kakudo]))
218
+
219
+ ushiro=u.iloc[uk.index(min(uk)),:]
220
+
221
+
222
+
223
+ df.at[k_index[i],collist[n]]=2/(1/mae[collist[n]]+1/ushiro[collist[n]])##ここの計算結果がnanの場合,欠損は埋めずに次のループに入る
224
+
225
+
226
+
227
+ print(df)
228
+
229
+ ```
230
+
231
+ ###発生しているエラー
232
+
233
+ ValueError: setting an array element with a sequence.
234
+
235
+
236
+
237
+ ###出来ていること
238
+
239
+ dfのe列,index=8までは思い通りに実装できています.