我经常想要一个统计数据的数据框,该数据框显示在熊猫进行groupby操作后每个组中有多少成员。我有一个详细的方法来处理大小,重置索引和重命名,但是我敢肯定有更好的方法。
这是我想做的事的一个例子:
import pandas as pd
import numpy as np
np.random.seed(0)
colors = ['red','green','blue']
cdf = pd.DataFrame({
'color1':np.random.choice(colors,10),
'color2':np.random.choice(colors,10),
})
print(cdf)
#better way to do next line? (somehow use agg?)
gb_count = cdf.groupby(['color1','color2']).size().reset_index().rename(columns={0:'num'})
print(gb_count)
#cdf.groupby(['color1','color2']).count() #<-- this doesn't work
最终输出:
color1 color2 num
0 blue green 1
1 blue red 1
2 green blue 3
3 red green 4
4 red red 1
答案 0 :(得分:2)
为避免获取MultiIndex,请使用as_index=False
:
cdf.groupby(['color1','color2'], as_index=False).size()
color1 color2 size
0 blue green 1
1 blue red 1
2 green blue 3
3 red green 4
4 red red 1
如果您明确要命名新列num
。您可以将reset_index
与name=..
一起使用,因为groupby
将返回一个序列:
cdf.groupby(['color1','color2']).size().reset_index(name='num')
color1 color2 num
0 blue green 1
1 blue red 1
2 green blue 3
3 red green 4
4 red red 1
答案 1 :(得分:1)
另一种方法是在reset the grouper_index
操作中将to_frame(with preferred column name)
发送给agg
之后。
gb_count = cdf.groupby(['color1','color2']).agg('size').to_frame('num').reset_index()
color1 color2 num
0 blue green 1
1 blue red 1
2 green blue 3
3 red green 4
4 red red 1