熊猫中缺少类别的累积总和

时间:2013-10-07 21:38:51

标签: python pandas

假设我有以下数据集

df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
           'count' : [8, 3, 2, 2, 8, 7] })
df = pd.DataFrame(df_dict)

df.set_index('unit', inplace = True)

看起来像这样:

    cat count
unit        
1    1   8
1    2   3
1    3   2
2    1   2
2    2   8
2    4   7

计数给出了在单位中观察到的不同类别的频率。 我想得到的是每个单元的四个类别的累积频率。请注意,单元1中缺少类别4,单元2中缺少类别3.

因此,最终结果将是

单元1的

[8/13, 11/13, 13/13, 13/13]

和第2单元:

[2/17, 10/17, 10/17, 17/17]

我知道如何获得groupbycumsum的累积总和,但是单位1,例如,没有丢失类别4的值。

谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

import pandas as pd


df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
           'count' : [8, 3, 2, 2, 8, 7] })
df = pd.DataFrame(df_dict)

df.set_index('unit', inplace = True)    

cumsum_count = df.groupby(level=0).apply(lambda x: pd.Series(x['count'].cumsum().values, index=x['cat']))
# unit  cat
# 1     1       8
#       2      11
#       3      13
# 2     1       2
#       2      10
#       4      17
# dtype: int64

cumsum_count = cumsum_count.unstack(level=1).fillna(method='ffill', axis=1)
# cat   1   2   3   4
# unit               
# 1     8  11  13  13
# 2     2  10  10  17

totals = df.groupby(level=0)['count'].sum()
# unit
# 1       13
# 2       17
# Name: count, dtype: int64

cumsum_dist = cumsum_count.div(totals, axis=0)
print(cumsum_dist)

产量

cat          1         2         3  4
unit                                 
1     0.615385  0.846154  1.000000  1
2     0.117647  0.588235  0.588235  1

我真的不知道如何解释这个解决方案 - 可能是因为我有点偶然地到达了它。灵感 来自Jeff's solution,使用了

s.apply(lambda x: pd.Series(1, index=x))

将值与索引相关联。将累积计数()关联后,例如[8,11,13],cat个数字( index ),例如[1,2,3],你基本上是免费的。其余的只是unstackfillnadivgroupby的标准应用。