如何对DataFrame多列执行GroupBy分组及自定义聚合操作
多列分组实现季度数据中4的占比统计
问题背景
现有如下结构的DataFrame:
Team Division Q1 Q2 Q3 Q4 0 Flames Pacific 4.0 1.0 3.0 1.0 1 Flames Pacific 4.0 1.0 2.0 2.0 2 Oilers Pacific 3.0 1.0 1.0 3.0 3 Canucks Pacific 2.0 NaN 4.0 2.0 4 Senators Eastern 1.0 4.0 4.0 3.0 5 Leats Eastern 4.0 3.0 4.0 2.0 6 Leats Eastern NaN 4.0 4.0 4.0 7 Canucks Pacific 2.0 2.0 2.0 3.0 8 Oilers Pacific 3.0 1.0 NaN 4.0 9 Flames Pacific 3.0 4.0 4.0 3.0 10 Oilers Pacific 2.0 3.0 1.0 4.0 11 Oilers Pacific 4.0 NaN 2.0 1.0 12 Senators Eastern 4.0 3.0 3.0 3.0 13 Leats Eastern 2.0 4.0 4.0 NaN
需求是按Team和Division列(未来可扩展其他列)分组,对Q1-Q4列统计值为4的数量占该列有效数据量的比例。原代码仅按Team分组,需修改实现多列分组。
原代码:
grouped = (df.filter(like='Q').groupby(df['Team']) .agg(lambda x: x.eq(4).sum()/x.count()) ) print(grouped)
修改方案
只需将groupby的分组键从单一列改为列名列表即可,未来扩展分组列时直接在列表中添加对应列名:
方式一:传入DataFrame列对象列表
grouped = (df.filter(like='Q').groupby([df['Team'], df['Division']]) .agg(lambda x: x.eq(4).sum()/x.count()) ) print(grouped)
方式二:传入列名字符串列表(推荐,可读性更强)
grouped = (df.filter(like='Q').groupby(['Team', 'Division']) .agg(lambda x: x.eq(4).sum()/x.count()) ) print(grouped)
说明
groupby支持传入列名列表作为分组依据,会按照多列的组合值进行分组;- 聚合逻辑保持不变:
lambda x: x.eq(4).sum()/x.count()会对每个Q列单独计算,值为4的行数除以该列非NaN的有效行数,得到占比; - 后续需要添加更多分组列时,直接在
groupby的列表中追加列名即可,无需修改聚合逻辑。
内容的提问来源于stack exchange,提问作者obi
相关产品推荐
相关产品推荐

