在数据框中,我有一个带有组名的文本列group
和一个列drop_week
,它们的分类值在[1,4]范围内。我想为每个组存储放假周的值1-4的累积计数。我正在这样做:
drop_data = all_data[['group', 'drop_week']].groupby('group')['drop_week'] \
.value_counts().unstack().transpose().fillna(0).cumsum().transpose()
,并且有效。但是,由于我花了2个小时的时间来提出此解决方案,因此我想知道是否有更好的方法来解决这个问题。
答案 0 :(得分:1)
您可以使用pd.crosstab
创建频率表。然后使用cumsum(axis=1)
计算每一行的累计总和:
pd.crosstab(index=all_data['group'], columns=all_data['drop_week']).cumsum(axis=1)
# drop_week 1 2 3 4
# group
# 0 12 17 21 27
# 1 7 13 18 25
# 2 9 14 22 26
# 3 5 11 16 22
同意
drop_data = (all_data[['group', 'drop_week']].groupby('group')['drop_week']
.value_counts().unstack().transpose().fillna(0).cumsum().transpose())
# drop_week 1 2 3 4
# group
# 0 12 17 21 27
# 1 7 13 18 25
# 2 9 14 22 26
# 3 5 11 16 22
我为此使用的设置是:
import numpy as np
import pandas as pd
np.random.seed(2019)
N = 100
all_data = pd.DataFrame({'group':np.random.randint(4, size=N),
'drop_week':np.random.randint(1,5, size=N)})
drop_data = (all_data[['group', 'drop_week']].groupby('group')['drop_week']
.value_counts().unstack().transpose().fillna(0).cumsum().transpose())