如何对DataFrame执行分组与透视操作,实现长表到指定宽表的转换
实现方法
完全可以实现,你需要的就是长表转宽表的透视操作,pandas的透视方法本身就内置了按指定维度分组的逻辑,不需要额外单独执行分组操作。
下面是三种常用实现方案:
方案1:用pandas.DataFrame.pivot
适合无重复分组的场景,也就是你的样例数据这种同一个Company+Period+Names组合只有一行值的情况:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'Names': ['HeadCount', 'HoursWorked', 'HeadCount', 'HoursWorked', 'HeadCount', 'HoursWorked'], 'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Google', 'Google'], 'Values': [1000, 500, 600, 200, 2000, 100], 'Period': [1,1,1,1,2,2] }) # 透视转换 result = df.pivot( index=['Company', 'Period'], # 保留的分组维度,作为结果行索引 columns='Names', # 要展开为新列的字段 values='Values' # 新列的取值来源字段 ).reset_index() # 把Company和Period从索引恢复为普通列 # 可选:去除列名的索引前缀,和目标格式完全对齐 result.columns.name = None
运行后得到的result就是你需要的结构。
方案2:用pandas.DataFrame.pivot_table
适合有重复分组、需要聚合的场景,比如同一个Company+Period+Names对应多个Values需要求和/求均值的情况,兼容性更强:
result = df.pivot_table( index=['Company', 'Period'], columns='Names', values='Values', aggfunc='sum' # 重复值的聚合规则,可根据需求改成'mean'/'max'等 ).reset_index() result.columns.name = None
方案3:用groupby+unstack组合
和透视操作逻辑完全等价,适合习惯用分组语法的场景:
result = df.groupby(['Company', 'Period', 'Names'])['Values'].sum().unstack('Names').reset_index() result.columns.name = None
内容的提问来源于stack exchange,提问作者user2896120
相关产品推荐
相关产品推荐

