如何将Pandas Dataframe按name聚合并交替展示class与#absence列
解决Pandas Dataframe宽表转换问题
先看示例原始数据:
import pandas as pd df = pd.DataFrame({ 'name': ['Alice', 'Alice', 'Bob', 'Bob'], 'class': ['Math', 'English', 'Math', 'Physics'], '#absence': [2, 1, 0, 3] })
要实现按name分组,每个class对应一列class值和一列absence值的宽表结构,可以用pivot结合列名调整来完成:
步骤1:执行pivot操作
指定索引为name,列名为class,同时将class和#absence作为值列,生成多级列的DataFrame:
pivoted_df = df.pivot(index='name', columns='class', values=['class', '#absence'])
步骤2:合并多级列名
把多级列名合并为可读性更强的单级列名,比如Math_class、Math_absence:
pivoted_df.columns = [f'{col[1]}_{col[0].strip("#")}' for col in pivoted_df.columns]
步骤3:重置索引(可选)
如果需要把name从索引转为普通列,执行重置索引操作:
pivoted_df = pivoted_df.reset_index()
最终得到的结果如下:
| name | Math_class | Math_absence | English_class | English_absence | Physics_class | Physics_absence |
|---|---|---|---|---|---|---|
| Alice | Math | 2 | English | 1 | NaN | NaN |
| Bob | Math | 0 | NaN | NaN | Physics | 3 |
如果你的数据存在name+class的重复组合,可以改用pivot_table并指定聚合函数(比如sum)来处理:
pivoted_df = df.pivot_table(index='name', columns='class', values=['class', '#absence'], aggfunc='sum')
内容的提问来源于stack exchange,提问作者Scott Gambale
相关产品推荐
相关产品推荐

