You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多行多列Pandas DataFrame转换为单行多列DataFrame

Pandas DataFrame 转单行多列格式解决方案

问题场景

原始DataFrame结构:

import pandas as pd

data = {
    'Before': [30.268212, 41.812730, 15.963645, 0.700160, 0.761483],
    'After': [26.627491, 39.254255, 16.607557, 0.733307, 0.787538]
}
df = pd.DataFrame(data, index=['amb_temp', 'engine_temp', 'engine_eff', 'avg_mile', 'cor_mile'])
df.index.name = 'Car measurements'

输出展示:

Car measurements                Before      After
amb_temp                        30.268212  26.627491
engine_temp                     41.812730  39.254255
engine_eff                      15.963645  16.607557
avg_mile                        0.700160   0.733307
cor_mile                        0.761483   0.787538

需要转换成单行多列的目标格式:

index  amb_temp_Before  amb_temp_After  engine_temp_Before  engine_temp_After  ...
0      30.268212        26.627491       41.812730          39.254255         ...

尝试df.pivot(columns='index', value=['Before','After'])得到了不符合预期的结果(含大量NaN的多行结构)。


正确转换方法

方法1:堆叠+展开索引(最直观)

通过堆叠索引层,合并索引名后转置为单行:

# 把Before/After列堆叠到索引层
stacked_df = df.stack()
# 将双层索引合并为单个列名(比如amb_temp_Before)
stacked_df.index = ['_'.join(idx) for idx in stacked_df.index]
# 转置为单行,重置索引并命名index列
modified_df = pd.DataFrame(stacked_df).T.reset_index(drop=True)
modified_df.index.name = 'index'

方法2:熔解+透视

先把宽表转长表,再重新透视成目标格式:

# 把行索引转为普通列
df_reset = df.reset_index()
# 熔解成长格式,拆分出测量项和阶段(Before/After)
melted_df = df_reset.melt(id_vars='Car measurements', var_name='Stage', value_name='Value')
# 合并测量项和阶段作为新列名
melted_df['new_col'] = melted_df['Car measurements'] + '_' + melted_df['Stage']
# 透视成单行多列,重置索引
modified_df = melted_df.pivot(columns='new_col', values='Value').reset_index(drop=True)
modified_df.index.name = 'index'

方法3:转置+扁平化列名(最简洁)

直接转置原表,然后合并多层列名:

# 转置原表,此时行是Before/After,列是测量项
transposed_df = df.T
# 合并列名和行名,生成新的列名(比如amb_temp_Before)
transposed_df.columns = [f'{col}_{row}' for row in transposed_df.index for col in transposed_df.columns]
# 重置索引并命名index列
modified_df = transposed_df.reset_index(drop=True)
modified_df.index.name = 'index'

内容的提问来源于stack exchange,提问作者Mainland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:33:09