如何使用pandas将DataFrame行数据转换为列数据
pandas实现Rank/Percentage拆分为独立列的方案
核心用pivot透视方法即可完成行列转换,以下是可直接复用的代码:
1. 匹配原始数据结构
先构造和示例一致的测试数据,你可以对照自己的实际DataFrame调整列名:
import pandas as pd # 原始数据结构:指标名(Rank/Percentage)存在同一列,和分组字段逐行对应 raw_df = pd.DataFrame({ 'Category': ['X', 'X', 'Y', 'Y', 'Z', 'Z'], 'MetricType': ['Rank', 'Percentage', 'Rank', 'Percentage', 'Rank', 'Percentage'], 'MetricValue': [1, '92%', 2, '85%', 3, '79%'] })
2. 核心转换代码
# 透视转换:以业务分组列为索引,指标类型拆为独立列,取对应指标值填充 target_df = raw_df.pivot( index='Category', columns='MetricType', values='MetricValue' ).reset_index() # 调整列顺序和目标格式对齐 target_df = target_df[['Category', 'Rank', 'Percentage']]
3. 特殊场景适配
- 无单独指标列、按行块存储的场景:如果原始数据没有单独的
MetricType列,前半段全是Rank数据、后半段全是Percentage数据,可以直接按行切片合并:
group_count = len(raw_df) // 2 rank_block = raw_df.iloc[:group_count].reset_index(drop=True) pct_block = raw_df.iloc[group_count:].reset_index(drop=True) target_df = pd.DataFrame({ 'Category': rank_block['Category'], 'Rank': rank_block['MetricValue'], 'Percentage': pct_block['MetricValue'] })
- 存在重复数据的场景:如果转换时报「存在重复索引/列组合」的错误,把
pivot换成pivot_table即可,指定聚合规则取对应值:
target_df = raw_df.pivot_table( index='Category', columns='MetricType', values='MetricValue', aggfunc='first' # 重复值取第一条,可根据需求替换为sum/mean等 ).reset_index()
- 数值计算场景:如果后续需要对Percentage做数值计算,可以加一步类型转换:
target_df['Percentage'] = target_df['Percentage'].str.strip('%').astype('float') / 100
转换效果
原始长表结构:
| Category | MetricType | MetricValue |
|---|---|---|
| X | Rank | 1 |
| X | Percentage | 92% |
| Y | Rank | 2 |
| Y | Percentage | 85% |
| Z | Rank | 3 |
| Z | Percentage | 79% |
转换后目标宽表结构:
| Category | Rank | Percentage |
|---|---|---|
| X | 1 | 92% |
| Y | 2 | 85% |
| Z | 3 | 79% |
内容的提问来源于stack exchange,提问作者Akankshya
相关产品推荐
相关产品推荐

