回答編集履歴

1

コメントを受けて回答を追記

2020/03/23 10:23

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -177,3 +177,67 @@
177
177
 
178
178
 
179
179
  一応わかりやすいようにコメントをふっておきましたが、よく解らない場合はコメント欄で質問してください。
180
+
181
+
182
+
183
+ ---
184
+
185
+
186
+
187
+ ** 【追記】**
188
+
189
+ 作成されるDFの列数が不定の場合の処理
190
+
191
+
192
+
193
+ ```Python
194
+
195
+ # Xが50以上の箇所にフラグを立てる
196
+
197
+ df['flag'] = (df['X'] > 50)
198
+
199
+ # 上記のフラグの纏まり毎にグループIDを振る
200
+
201
+ df['grp'] = (df.shift()['flag'] != df['flag']).cumsum()
202
+
203
+
204
+
205
+ # GroupID を変換
206
+
207
+ def conv(d):
208
+
209
+ if d % 4 == 1:
210
+
211
+ ret = d
212
+
213
+ elif d % 4 == 2:
214
+
215
+ ret = d-1
216
+
217
+ elif d % 4 == 3:
218
+
219
+ ret = 0
220
+
221
+ else:
222
+
223
+ ret = d
224
+
225
+ return ret
226
+
227
+
228
+
229
+ df['grp'] = df['grp'].map(conv)
230
+
231
+ # GroupID 0 を削除
232
+
233
+ df = df.loc[df['grp']!=0]
234
+
235
+ # GroupID毎に列にまとめる
236
+
237
+ ret = df.groupby('grp')['X'].apply(lambda d: d.reset_index(drop=True)).unstack().T
238
+
239
+ # カラム名を0から振り直す
240
+
241
+ ret.column = range(ret.shape[1])
242
+
243
+ ```