如何用Pandas实现列与表头子集互换及表格结构重塑?
解决方案
首先纠正你之前的melt用法错误——你只指定了单个value_vars,但实际需要把所有element #1、element #2、element #3列都转成行。然后结合pivot_table处理重复值问题(pivot要求索引+列的组合唯一,而pivot_table可通过聚合函数兼容重复项),分两步完成重塑:
步骤1:正确执行melt,将多列element转为单列
假设你的原始DataFrame名为df,先把所有element列合并为fin_element单列,保留关键标识列和financial_period:
# 筛选所有以element开头的列 element_cols = [col for col in df.columns if col.startswith('element')] # 执行melt转换 df_melted = df.melt( id_vars=['University id #', 'Year', 'financial_period'], value_vars=element_cols, var_name='fin_element', # 给新的element列命名 value_name='amount' # 给数值列命名 )
步骤2:用pivot_table将financial_period转为列头
针对重复值问题,通过聚合函数(如first取首个值、sum求和、mean取平均,根据你的业务需求选择)处理:
df_pivoted = df_melted.pivot_table( index=['University id #', 'Year', 'fin_element'], columns='financial_period', values='amount', aggfunc='first' ).reset_index()
可选:若重复值是脏数据,先去重再用pivot
如果重复项是无效数据,可先去重再用pivot(此时索引+列组合唯一,不会报错):
# 去重,保留唯一的(University id #, Year, fin_element, financial_period)组合 df_melted_clean = df_melted.drop_duplicates(subset=['University id #', 'Year', 'fin_element', 'financial_period']) # 执行pivot转换 df_pivoted = df_melted_clean.pivot( index=['University id #', 'Year', 'fin_element'], columns='financial_period', values='amount' ).reset_index()
示例效果
假设原始数据:
| University id # | Year | financial_period | element #1 | element #2 | element #3 |
|---|---|---|---|---|---|
| 101 | 2023 | Q1 | 1000 | 2000 | 3000 |
| 101 | 2023 | Q2 | 1500 | 2500 | 3500 |
处理后得到目标结构:
| University id # | Year | fin_element | Q1 | Q2 |
|---|---|---|---|---|
| 101 | 2023 | element #1 | 1000 | 1500 |
| 101 | 2023 | element #2 | 2000 | 2500 |
| 101 | 2023 | element #3 | 3000 | 3500 |
内容的提问来源于stack exchange,提问作者kkk
相关产品推荐
相关产品推荐

