前提
Python3
Pandas
実現したいこと
以下のようなPandasのDataFrameがあります。
実際は30万行ほどあり、カラムももっと多いです。
time | data1 | data2 |
---|---|---|
12:53:31 | 101 | 1 |
12:53:32 | 102 | 1 |
12:53:32 | 105 | 1 |
12:53:33 | 102 | 1 |
12:53:34 | 103 | 1 |
12:53:35 | 99 | 1 |
12:53:36 | 100 | 1 |
12:53:37 | 110 | 1 |
12:53:38 | 112 | 0 |
12:53:39 | 98 | 0 |
12:53:40 | 92 | 0 |
12:53:41 | 100 | 0 |
12:53:42 | 104 | 0 |
12:53:42 | 105 | 0 |
12:53:43 | 97 | 1 |
12:53:44 | 99 | 1 |
12:53:45 | 100 | 1 |
12:53:46 | 103 | 1 |
12:53:47 | 102 | 1 |
12:53:48 | 101 | 1 |
12:53:49 | 108 | 1 |
12:53:50 | 91 | 1 |
12:53:51 | 99 | 0 |
12:53:52 | 93 | 0 |
12:53:52 | 99 | 0 |
12:53:53 | 100 | 0 |
12:53:54 | 101 | 1 |
12:53:55 | 102 | 1 |
12:53:56 | 97 | 1 |
12:53:47 | 100 | 0 |
12:53:48 | 100 | 0 |
12:53:49 | 101 | 0 |
・・・ |
timeがindexになっており、data2は他の値に応じてつけられた判定用のカラムです。
このとき、
1が連続して5行以上現れたときに、
その最初の5行のdata1の値を使ってなにかしらを計算し結果を出力
5行目以降の1がある列とその下に連続する0の行は無視して、
また1が連続して5行以上現れるところで同じ計算をする
といった作業を行いたいです。
つまり、下のようになると嬉しいです。
time | data1 | data2 |
---|---|---|
12:53:31 | 101 | 1 |
12:53:32 | 102 | 1 |
12:53:32 | 105 | 1 |
12:53:33 | 102 | 1 |
12:53:34 | 103 | 1 |
→この5行から計算(例えば101,102,105,102,103の平均値を求めるなど)
その下のいくつかの行を飛ばし、次に計算するのはまた1が表れるこの5行
time | data1 | data2 |
---|---|---|
12:53:43 | 97 | 1 |
12:53:44 | 99 | 1 |
12:53:45 | 100 | 1 |
12:53:46 | 103 | 1 |
12:53:47 | 102 | 1 |
といった具合です。
Pandasでは1行目からループを回して計算するのは悪手だと聞いています。
どのように書くのが良いでしょうか。
実際は5行ではなくもっと長い(5000行)塊を探す必要があります。
また、見つけた塊に対する計算処理も平均値ではなくもっと複雑な計算です。
試したこと
.groupbyも違いますし、
https://teratail.com/questions/110232
これも少し違います。
お力を貸していただければ幸いです。
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/09/23 06:05