假设我有以下
bin=[0,5,10]
sex age num
1 4 11
1 3 12
2 2 13
2 10 14
我想在num和count年龄中求和。 首先我试过
df.groupby([df.sex,pd.cut(df.age,bin)]).size()
或
df.groupby([df.sex,pd.cut(df.age,bin)]).sum()
但我无法弄清楚如何聚合和转换它们。 我想要以下结果。像
sex age num
1 [0,5) 2 23
1 [5,10) 0 0
2 [0,5) 1 13
2 [5,10) 1 14
如果我能以简单的方式得到这个结果,请有人告诉我如何转换原始数据帧。
答案 0 :(得分:1)
使用agg
,然后按unstack
+ stack
添加缺失值:
df = df.groupby([df.sex,pd.cut(df.age,bin)])
.agg({'num':'sum', 'age':'size'})
.unstack(fill_value=0)
.stack()
print (df)
num age
sex age
1 (0, 5] 23 2
(5, 10] 0 0
2 (0, 5] 13 1
(5, 10] 14 1
或创建MultiIndex
和reindex
:
bin=[0,5,10]
cats = pd.cut(df.age,bin)
mux = pd.MultiIndex.from_product([df.sex.unique(), cats.cat.categories])
df = df.groupby([df.sex,cats]).agg({'num':'sum', 'age':'size'}).reindex(mux, fill_value=0)
print (df)
num age
1 (0, 5] 23 2
(5, 10] 0 0
2 (0, 5] 13 1
(5, 10] 14 1