[英]Pandas cumulative count
我有一個像這樣的數據框:
0 04:10 obj1
1 04:10 obj1
2 04:11 obj1
3 04:12 obj2
4 04:12 obj2
5 04:12 obj1
6 04:13 obj2
想要獲得所有對象的累積計數,如下所示:
idx time object obj1_count obj2_count
0 04:10 obj1 1 0
1 04:10 obj1 2 0
2 04:11 obj1 3 0
3 04:12 obj2 3 1
4 04:12 obj2 3 2
5 04:12 obj1 4 2
6 04:13 obj2 4 3
嘗試過使用cumsum,但不確定是否正確。 有什么建議么?
此操作有一個特殊功能: cumcount
>>> df = pd.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']], columns=['A'])
>>> df
A
0 a
1 a
2 a
3 b
4 b
5 a
>>> df.groupby('A').cumcount()
0 0
1 1
2 2
3 0
4 1
5 3
dtype: int64
>>> df.groupby('A').cumcount(ascending=False)
0 3
1 2
2 1
3 1
4 0
5 0
dtype: int64
您可以將列與興趣值進行比較,然后調用cumsum
:
In [12]:
df['obj1_count'] = (df['object'] == 'obj1').cumsum()
df['obj2_count'] = (df['object'] == 'obj2').cumsum()
df
Out[12]:
time object obj1_count obj2_count
idx
0 04:10 obj1 1 0
1 04:10 obj1 2 0
2 04:11 obj1 3 0
3 04:12 obj2 3 1
4 04:12 obj2 3 2
5 04:12 obj1 4 2
6 04:13 obj2 4 3
這里的比較將產生一個布爾序列:
In [13]:
df['object'] == 'obj1'
Out[13]:
idx
0 True
1 True
2 True
3 False
4 False
5 True
6 False
Name: object, dtype: bool
當您在上面調用cumsum
時,將True
值轉換為1
,將False
轉換為0
並進行累加
您可以通過獲取cumsum
的pd.get_dummies
來概括該過程。 這應該適用於要計數的任意數量的對象,而無需分別指定每個對象:
# Get the cumulative counts.
counts = pd.get_dummies(df['object']).cumsum()
# Rename the count columns as appropriate.
counts = counts.rename(columns=lambda col: col+'_count')
# Join the counts to the original df.
df = df.join(counts)
結果輸出:
time object obj1_count obj2_count
0 04:10 obj1 1 0
1 04:10 obj1 2 0
2 04:11 obj1 3 0
3 04:12 obj2 3 1
4 04:12 obj2 3 2
5 04:12 obj1 4 2
6 04:13 obj2 4 3
如果可以使用count作為前綴而不是后綴,即'count_obj1'
而不是'obj1_count'
,則可以省略rename
步驟。 只需使用pd.get_dummies
的prefix
參數:
counts = pd.get_dummies(df['object'], prefix='count').cumsum()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.