分类数据的累积值计数,分组依据

时间:2019-01-23 04:09:12

标签: pandas pandas-groupby

在数据框中,我有一个带有组名的文本列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个小时的时间来提出此解决方案,因此我想知道是否有更好的方法来解决这个问题。

1 个答案:

答案 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())