###前提・実現したいこと
以前も同じような質問をこちらでさせて頂いたのですが、不足があったので、再度皆様のお力を貸して頂ければと思います。
以下のような時系列のデータ(X)があった際に、先頭フラグ(Y)を基準として、そこから何サンプル毎、というような取り出し方をして新しいデータテーブルを作る際に、一発で変換する方法はありますでしょうか。SQL, pandas問いません。現在、for文を用いてstackをしていますが、処理が遅く困っています。また、前回cumsumとheadを使用した方法を教えて頂いたのですが、headでは実現したい処理に少し手が届かなく困っております。
###対象のデータ
X = 256, 250, 240, 230, 240, 244, 250, 260, 255, 264, 222, 243, 255
Y = 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0
Y = 1の位置から5つ毎のデータを取得してテーブルにする
###実現したい変換先データ
X = 256, 250, 240, 230, 240, 240, 244, 250, 260, 255, 260, 255, 264, 222, 243
L = 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3
※Lは新データの番号
###stack思考のコード
Python
1import pandas as pd 2 3X = [256, 250, 240, 230, 240, 244, 250, 260, 255, 264, 222, 243, 255] 4Y = [ 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0] 5 6data = pd.DataFrame() 7data["X"] = X 8data["Y"] = Y 9 10print(data) 11 12newX = [] 13newL = [] 14for label, index in enumerate(data[data["Y"]==1].index): 15 newX.extend(data["X"][index:index+5].values) 16 for i in range(5): 17 newL.append(label) 18 19newData = pd.DataFrame() 20newData["X"] = newX 21newData["L"] = newL 22print(newData)
###headを用いたコード
Python
1import pandas as pd 2 3df = pd.DataFrame({ 4 'X': [256, 250, 240, 230, 240, 244, 250, 260, 255, 264, 222, 243, 255], 5 'Y': [ 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]}) 6 7df['L'] = (df['Y'] == 1).cumsum() 8 9df_new = df[df['L'] > 0].groupby('L').head(5) ##Lのラベルの範囲を超えているので取得できない
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/30 05:19
2021/08/30 05:26