Pandas:将透视表堆叠列拆分为带类别命名的新列
解决DataFrame透视表列名展平与重命名问题
需求说明
将包含重复IDNum、Category的DataFrame转换为每行对应一个IDNum,列名以Category_value格式展示对应数值的结构。
原始DataFrame
import pandas as pd df = pd.DataFrame({'IDNum': [1, 1, 2, 3, 3, 4], 'Category': ['a', 'b', 'a', 'c', 'b', 'b'], 'value1': [1.5, 2.2, 3.6, 5.1, 6.0, 1.0], 'value2': [2.0, 3.6, 4.5, 8.2, 6.1, 1.2]})
输出:
IDNum Category value1 value2 0 1 a 1.5 2.0 1 1 b 2.2 3.6 2 2 a 3.6 4.5 3 3 c 5.1 8.2 4 3 b 6.0 6.1 5 4 b 1.0 1.2
已生成的透视表
通过pivot_table生成了多级列名的透视表:
table = pd.pivot_table(df, values=['value1', 'value2'], index = 'IDNum', columns = 'Category')
输出:
value1 value2 Category a b c a b c IDNum 1 1.5 2.2 NaN 2.0 3.6 NaN 2 3.6 NaN NaN 4.5 NaN NaN 3 NaN 6.0 5.1 NaN 6.1 8.2 4 NaN 1.0 NaN NaN 1.2 NaN
解决方案
只需两步即可将多级列名展平为Category_value格式,并将IDNum转为普通列:
# 合并多级列名,按"Category_value"格式拼接 table.columns = table.columns.map(lambda x: f"{x[1]}_{x[0]}") # 重置索引,把IDNum从索引转为普通列 result = table.reset_index()
最终结果
IDNum a_value1 b_value1 c_value1 a_value2 b_value2 c_value2 0 1 1.5 2.2 NaN 2.0 3.6 NaN 1 2 3.6 NaN NaN 4.5 NaN NaN 2 3 NaN 6.0 5.1 NaN 6.1 8.2 3 4 NaN 1.0 NaN NaN 1.2 NaN
补充方法
如果不想先创建透视表,也可以直接用unstack一步到位:
result = df.set_index(['IDNum', 'Category']).unstack() result.columns = result.columns.map(lambda x: f"{x[1]}_{x[0]}") result = result.reset_index()
内容的提问来源于stack exchange,提问作者Cat Schooley
相关产品推荐
相关产品推荐

