Pandas Dataframe 分组 - 显示组统计信息
对于这个Pandas数据框:
import pandas as pd
codes = ["one","two","three"];
colours = ["black", "white"];
textures = ["soft", "hard"];
N= 100 # length of the dataframe
df = pd.DataFrame({ 'id' : range(1,N+1),
'code' : [random.choice(codes) for i in range(1,N+1)],
'colour': [random.choice(colours) for i in range(1,N+1)],
'texture': [random.choice(textures) for i in range(1,N+1)],
'size': [random.randint(1,100) for i in range(1,N+1)]
}, columns= ['id','code','colour', 'texture', 'size'])
我运行下面这行代码来获取按code
和colour
组合分组的总大小:
grouped = df.groupby(['code', 'colour']).agg({'size' : np.sum}).reset_index()
>> grouped
>> code colour size
>> 0 one black 987
>> 1 one white 972
>> 2 three black 972
>> 3 three white 488
>> 4 two black 1162
>> 5 two white 1158
>> [6 rows x 3 columns]
除了总大小(np.sum)之外,我还想要单独的列来显示:
i. 每组的平均值(np.avg)
ii. 每组中最大大小的那一行的ID
iii. 这个组出现的次数(例如,code=one,colour=black,出现了12次)
问题:有什么最快的方法来做到这一点?我需要使用apply()
和一个自定义函数吗?
1 个回答
5
你可以传递一个函数列表,这些函数会应用到分组上,比如:
grouped = df.groupby(['code', 'colour'])['size'].agg([np.sum, np.average, np.size, np.argmax]).reset_index()
因为 argmax
是最大行的索引,所以你需要在原始数据表中查找这些索引:
grouped['max_row_id'] = df.ix[grouped['argmax']].reset_index(grouped.index).id
注意:我选择了“size”这一列,因为所有的函数都是针对这一列的。如果你想对不同的列使用不同的函数,可以用 agg
方法,传入一个字典,里面包含函数的列表,比如 agg({'size': [np.sum, np.average]})
。这样会得到 MultiIndex
列,这意味着当你想获取每个分组中最大大小的ID时,你需要这样做:
grouped['max_row_id'] = df.ix[grouped['size']['argmax']].reset_index(grouped.index).id