如何将多行多列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
相关产品推荐
相关产品推荐

