前提・実現したいこと
Pandasで時系列データの処理をしています。
OFFのときは0で、記録中はプラスの値が入っているのですが、たまにOFFなのに値が入っていることがあり、これを0にしたいです。4行以上連続で値が入っていれば記録中とみなします。
以下のような表で、「記録値」を「処理後」にしたいです。
|時刻|記録値|処理後|
|12:00|0|0|
|12:01|0|0|
|12:03|1|0|
|12:04|0|1|
|12:05|3|3|
|12:06|2|2|
|12:07|4|4|
|12:08|1|1|
|12:09|2|2|
|12:10|0|0|
|12:11|0|0|
|12:12|1|0|
|12:13|3|0|
|12:14|1|0|
|12:15|0|0|
発生している問題・エラーメッセージ
「該当行の上2行のいずれかが0かつ下2行のいずれかが0なら0にする」という処理をすると1点のみと2点連続は0になり、3点連続は1点のみになります。
(1点のみ:010→000 2点連続:0220→0000 3点連続:01110→01010)
これに続いて「上の行も下の行も0なら0にする」という処理をすることを考えました。
ただ、表全体に2段階の処理を適用することになるのでより速いやり方にしたいのですが思いつきません。
該当のソースコード
Python
1For i in range(2, (len(df)): #i-2がエラーにならないように3行目からループ(はじめの2行は常に0) 2 if ((df.iat[(i+1),1] == 0)|(df.iat[(i+2),1] == 0))&((df.iat[(i-1),1] == 0)|(df.iat[(i-2),1] == 0)): 3 df.iat[i, 1] = 0 4 5For i in range(2, (len(df)): 6 if (df.iat[(i+1),1] == 0)&(df.iat[(i-1),1] == 0): 7 df.iat[i, 1] = 0
試したこと
新しい列を作って、0ならFalse、0より大きければTrueを入れて、TrueかFalseが連続しているところに同じ番号をつけるということもしてみたのですが、その先で「4行以上連続」をどう認識させればいいのか思いつきませんでした。
Python
1df['over0'] = df['記録値']>0 2df['group'] = (df['over0'] != df['over0'].shift(1)).cumsum()
補足情報(FW/ツールのバージョンなど)
Python3.8
回答4件
あなたの回答
tips
プレビュー