![](/img/trans.png)
[英]How to do a conditional count after groupby on a Pandas Dataframe?
[英]How do I count # of changes in pandas dataframe by groupby?
我有一個看起來像的數據:
df = pd.DataFrame({
'ID': [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
'DATE': ['1/1/2015','1/2/2015', '1/3/2015','1/4/2015','1/5/2015','1/6/2015','1/7/2015','1/8/2015',
'1/9/2016','1/2/2015','1/3/2015','1/4/2015','1/5/2015','1/6/2015','1/7/2015'],
'CD': ['A','A','A','A','B','B','A','A','C','A','A','A','A','A','A']})
我想計算 ID 和 CD 發生的更改數量。 我怎樣才能得到想要的結果。 當我嘗試 cumcount 時,它會計算相同的 groupby 並給它不同的數字。
我得到的是:
我期待的是:
您在所需 output 中的count
列表示組
制作grouper
來划分組(為了便於查看,將 bool 更改為 int)
col = ['ID', 'CD']
grouper = df[col].ne(df[col].shift(1)).any(axis=1).astype('int')
grouper
0 1
1 0
2 0
3 0
4 1
5 0
6 1
7 0
8 1
9 1
10 0
11 0
12 0
13 0
14 0
dtype: int32
在同一 ID 中划分組(我將grouper
設為count
列,因為無論如何都必須創建count
列。)
df.assign(count=grouper).groupby('ID')['count'].cumsum()
output:
0 1
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 1
10 1
11 1
12 1
13 1
14 1
Name: count, dtype: int32
使 output 成為計數列
df.assign(count=df.assign(count=grouper).groupby('ID')['count'].cumsum())
結果:
ID DATE CD count
0 1 1/1/2015 A 1
1 1 1/2/2015 A 1
2 1 1/3/2015 A 1
3 1 1/4/2015 A 1
4 1 1/5/2015 B 2
5 1 1/6/2015 B 2
6 1 1/7/2015 A 3
7 1 1/8/2015 A 3
8 1 1/9/2016 C 4
9 2 1/2/2015 A 1
10 2 1/3/2015 A 1
11 2 1/4/2015 A 1
12 2 1/5/2015 A 1
13 2 1/6/2015 A 1
14 2 1/7/2015 A 1
更新完整代碼
更簡單的完整代碼和@cottontail 的建議
col = ['ID', 'CD']
grouper = df[col].ne(df[col].shift(1)).any(axis=1).astype('int')
df.assign(count=grouper.groupby(df['ID']).cumsum())
讓我們在 ID 列上分組並在 CD 上使用 shift 檢查更改,然后使用 cumsum 創建順序計數器
df['count'] = df.groupby('ID')['CD'].apply(lambda s: s.ne(s.shift()).cumsum())
結果
ID DATE CD count
0 1 1/1/2015 A 1
1 1 1/2/2015 A 1
2 1 1/3/2015 A 1
3 1 1/4/2015 A 1
4 1 1/5/2015 B 2
5 1 1/6/2015 B 2
6 1 1/7/2015 A 3
7 1 1/8/2015 A 3
8 1 1/9/2016 C 4
9 2 1/2/2015 A 1
10 2 1/3/2015 A 1
11 2 1/4/2015 A 1
12 2 1/5/2015 A 1
13 2 1/6/2015 A 1
14 2 1/7/2015 A 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.