如何使用Pandas将指定DataFrame重塑为目标格式?
Pandas实现DataFrame行列结构转换
原始数据
先还原示例中的DataFrame:
import pandas as pd data = { 'US': [324173084, 198511109, 38526055], 'US_bp': [41393176, 19510415, 8402643], 'US_bp%': [12.8, 9.8, 21.8], 'AL': [4920613, 3218517, 1260356], 'AL_bp': [794326, 378269, 327284], 'AL_bp%': [16.1, 11.8, 26.0] } df = pd.DataFrame(data, index=['total_pop', 'white', 'black'])
原始结构:
US US_bp US_bp% AL AL_bp AL_bp% total_pop 324173084 41393176 12.8 4920613 794326 16.1 white 198511109 19510415 9.8 3218517 378269 11.8 black 38526055 8402643 21.8 1260356 327284 26.0
目标格式
需要转换为如下结构:
place total_pop bp bp% white_pop white_bp white_bp% black_pop black_bp black_bp% 0 US 324173084 41393176 12.8 198511109 19510415 9.8 38526055 8402643 21.8 1 AL 4920613 794326 16.1 3218517 378269 11.8 1260356 327284 26.0
(注:目标数据中black_pop的US数值存在笔误,代码会保留原始正确值)
实现步骤
1. 拆分列名,分离地区与指标
将列名按下划线_拆分,生成多级列索引,区分地区(如US、AL)和指标类型(如空、bp、bp%):
# 拆分列名,生成多级列索引 df.columns = df.columns.str.split('_', expand=True) # 为多级列索引命名 df.columns.names = ['place', 'metric']
2. 转置并重塑数据
通过转置和堆叠调整数据结构,让地区成为行维度,人口类型+指标组合为列维度:
# 转置后堆叠,重新组织数据结构 df_transposed = df.T.unstack(level=0)
3. 整理列名与索引
将多级列名合并为目标格式的单一列名,同时重置索引把地区转为普通列:
# 合并多级列名,生成如total_pop、white_bp这类列名 df_transposed.columns = [ f'{col[0]}_{col[1]}' if col[1] else col[0] for col in df_transposed.columns ] # 重置索引,将place从索引转为列 result = df_transposed.reset_index().rename(columns={'level_0': 'place'})
4. 调整列顺序(可选)
如果需要和目标列顺序完全匹配,手动指定列的顺序:
desired_columns = [ 'place', 'total_pop', 'bp', 'bp%', 'white_pop', 'white_bp', 'white_bp%', 'black_pop', 'black_bp', 'black_bp%' ] result = result[desired_columns]
最终结果
执行上述代码后,result就是目标格式的DataFrame,打印输出即可得到符合要求的结构。
内容的提问来源于stack exchange,提问作者neendoniss
相关产品推荐
相关产品推荐

