如何用Pandas生成带多聚合的自定义分组DataFrame
Pandas实现按Type和状态统计指标数量
原始DataFrame
Id Type Speed Efficiency Durability 0 Id001 A OK OK nonOK 1 Id002 A nonOK OK nonOK 2 Id003 B nonOK nonOK nonOK 3 Id004 B nonOK nonOK OK 4 Id005 A nonOK nonOK OK 5 Id006 A OK OK OK 6 Id007 A OK nonOK OK 7 Id008 B nonOK nonOK OK 8 Id009 C OK OK OK 9 Id010 B OK OK nonOK 10 Id011 C OK nonOK OK 11 Id012 C OK nonOK OK 12 Id013 C nonOK OK OK 13 Id014 C nonOK nonOK OK 14 Id015 C nonOK nonOK OK
期望输出
Type Test Speed Efficiency Durability 0 A OK 3 3 3 1 A nonOK 2 2 2 2 B OK 1 1 2 3 B nonOK 3 3 2 4 C OK 3 2 6 5 C nonOK 3 4 0
实现方案
你之前用的groupby('Type').agg('count')仅能统计每组行数,无法拆分OK/nonOK的状态统计,这里提供两种可行方案:
方法1:melt+pivot_table(直观易理解)
import pandas as pd # 1. 将宽表转成长表,提取Type、指标名称、状态值 melted_df = df.melt( id_vars='Type', value_vars=['Speed', 'Efficiency', 'Durability'], var_name='Metric', value_name='Test' ) # 2. 按Type和Test分组,统计每个指标的数量 result = melted_df.pivot_table( index=['Type', 'Test'], columns='Metric', aggfunc='count', fill_value=0 ).reset_index() # 3. 调整列顺序匹配目标格式 result = result[['Type', 'Test', 'Speed', 'Efficiency', 'Durability']]
方法2:groupby+自定义统计函数(效率更高)
import pandas as pd # 定义统计函数:返回当前列中OK和nonOK的数量 def count_ok_nonok(series): count_ok = (series == 'OK').sum() count_nonok = (series == 'nonOK').sum() return pd.Series([count_ok, count_nonok], index=['OK', 'nonOK']) # 按Type分组,对三个指标列应用统计函数 result = df.groupby('Type')[['Speed', 'Efficiency', 'Durability']].agg(count_ok_nonok) # 展开多层索引,整理成目标格式 result = result.unstack().reset_index() result.columns = ['Type', 'Test', 'Speed', 'Efficiency', 'Durability']
两种方法均可得到目标输出,小数据场景用方法1更直观,大数据场景用方法2效率更优。
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

