假设我有以下数据集
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]
我知道如何获得groupby
和cumsum
的累积总和,但是单位1,例如,没有丢失类别4的值。
谢谢你的时间!
答案 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],你基本上是免费的。其余的只是unstack,fillna,div和groupby的标准应用。