Pandas Dataframe 分组 - 显示组统计信息

1 投票
1 回答
2109 浏览
提问于 2025-04-18 09:39

对于这个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'])

我运行下面这行代码来获取按codecolour组合分组的总大小:

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

撰写回答