#連続するデータの変化の回数を数える。
以下のテストデータでarea毎にvalの値が変化する回数を数える
#テストデータ
import pandas as pd
dt={
"area" :[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],
"seq" :[1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8],
"val" :[1,2,2,1,3,3,3,1,1,1,2,2,2,1,1,2]
}
df=pd.DataFrame(dt)
print(df.to_markdown())
area | seq | val | |
---|---|---|---|
0 | 1 | 1 | 1 |
1 | 1 | 2 | 2 |
2 | 1 | 3 | 2 |
3 | 1 | 4 | 1 |
4 | 1 | 5 | 3 |
5 | 1 | 6 | 3 |
6 | 1 | 7 | 3 |
7 | 1 | 8 | 1 |
8 | 2 | 1 | 1 |
9 | 2 | 2 | 1 |
10 | 2 | 3 | 2 |
11 | 2 | 4 | 2 |
12 | 2 | 5 | 2 |
13 | 2 | 6 | 1 |
14 | 2 | 7 | 1 |
15 | 2 | 8 | 2 |
#期待する答え
area 1:5個
area 2:4個
#変化の回数のカウント
#変化点を求める
df.sort_values(["area" , "seq"] ,inplace=True)
df["cnt"]=df.groupby(["area"])["val"].diff().apply(lambda x:0 if x==0 else 1 )
print("変化点")
print(df.to_markdown())
#変化の回数
df2=df.groupby(["area"]).cnt.sum()
print("変化の回数")
print(df2.to_markdown())
#変化点
area | seq | val | cnt | |
---|---|---|---|---|
0 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 2 | 1 |
2 | 1 | 3 | 2 | 0 |
3 | 1 | 4 | 1 | 1 |
4 | 1 | 5 | 3 | 1 |
5 | 1 | 6 | 3 | 0 |
6 | 1 | 7 | 3 | 0 |
7 | 1 | 8 | 1 | 1 |
8 | 2 | 1 | 1 | 1 |
9 | 2 | 2 | 1 | 0 |
10 | 2 | 3 | 2 | 1 |
11 | 2 | 4 | 2 | 0 |
12 | 2 | 5 | 2 | 0 |
13 | 2 | 6 | 1 | 1 |
14 | 2 | 7 | 1 | 0 |
15 | 2 | 8 | 2 | 1 |
#変化の回数 | ||||
area | cnt | |||
-------: | ------: | |||
1 | 5 | |||
2 | 4 |