Python中pivot DataFrame指定值转为表头,按id/date分组聚合的实现方法
实现代码
import pandas as pd # 1. 构造分类值的计数哑变量,仅保留需要统计的hi、hey # 处理type列的计数 type_dummies = pd.get_dummies(df['type'])[['hi', 'hey']] # 处理de_type列的计数,避免列名重复先加临时后缀 de_type_dummies = pd.get_dummies(df['de_type'], suffix='_de')[['hi_de', 'hey_de']] # 合并回原表 df = pd.concat([df, type_dummies, de_type_dummies], axis=1) # 2. 按id、date分组聚合 result = df.groupby(['id', 'date'], as_index=False).agg( # type相关统计 hey=('hey', 'sum'), hi=('hi', 'sum'), total=('type', 'count'), sum=('pwr', 'sum'), # de_type相关统计 hey_de=('hey_de', 'sum'), hi_de=('hi_de', 'sum'), totald=('de_type', 'count'), desum=('de_pwr', 'sum'), # 固定字段取第一个值即可 base=('base', 'first'), base_pos=('base_pos', 'first') ) # 3. 调整列名匹配预期输出,重命名de相关的hi、hey列 result.columns = ['id', 'date', 'hey', 'hi', 'total', 'sum', 'hey', 'hi', 'totald', 'desum', 'base', 'base_pos'] # 可选:所有数值列统一转int,避免空值导致的浮点数问题 result = result.fillna(0).astype({col: 'int' for col in result.columns if col not in ['id', 'date']})
逻辑说明
- 先用
pd.get_dummies把type和de_type的目标枚举值转成0/1计数列,方便分组后直接求和得到各值的出现次数 - 分组聚合时分别统计两类指标的计数、求和结果,固定属性
base和base_pos同一个分组下值一致,取第一个即可 - 最后调整列名即可匹配你给出的预期输出格式
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

