🕌

pandas でデータの変化点のみを取り出す

2022/10/07に公開

pandas でデータの変化点のみを取り出す

DataFrame の特定の列が変化した行のみ取り出す

コード

以下サンプルコードでは乱数で入力データを作っているため、実行しても説明で記載のデータと一致しない。(一致するとは限らない)

https://github.com/m-tmatma/pandas-test/blob/8d3fe849eb345045be1c78213c63eadaa6548e51/state_change.py

説明

df に pandas の DataFrame が入っているとする。
state が変化したタイミングのデータを取得したいとする。

df

オリジナルデータ (乱数を使って生成)

x y state
0 0 100 3
1 1 101 1
2 2 102 0
3 3 103 1
4 4 104 1
5 5 105 1
6 6 106 1
7 7 107 2
8 8 108 1
9 9 109 0

df.shift()

1行下に shift

x y state
0 nan nan nan
1 0 100 3
2 1 101 1
3 2 102 0
4 3 103 1
5 4 104 1
6 5 105 1
7 6 106 1
8 7 107 2
9 8 108 1

states != states.shift()

state を下に 1行 shift したものとオリジナルが等しいか判断する。
変化点になる行の場合 change の値が True になる。

states = df['state']
df['change'] = states != states.shift()

df に change が追加されている。

x y state change
0 0 100 3 True
1 1 101 1 True
2 2 102 0 True
3 3 103 1 True
4 4 104 1 False
5 5 105 1 False
6 6 106 1 False
7 7 107 2 True
8 8 108 1 True
9 9 109 0 True

df[ df['change'] ]

df['change'] が True である要素のみ df から取り出して別の DataFrame (dfChange) に格納する。

dfChange = df[ df['change'] ]

dfChange (dfstate の値が変化した要素のみ含んでいる)

x y state change
0 0 100 3 True
1 1 101 1 True
2 2 102 0 True
3 3 103 1 True
7 7 107 2 True
8 8 108 1 True
9 9 109 0 True

Discussion