🕌
pandas でデータの変化点のみを取り出す
pandas でデータの変化点のみを取り出す
DataFrame の特定の列が変化した行のみ取り出す
コード
以下サンプルコードでは乱数で入力データを作っているため、実行しても説明で記載のデータと一致しない。(一致するとは限らない)
説明
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 (df で state の値が変化した要素のみ含んでいる)
| 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