如何将Pandas DataFrame中列A的行值转为列名、列B的行值转为对应列的行数据?
解决方法
你需要先为每个A分组内的元素分配一个行序号,再通过pivot实现转换——这正是你之前尝试时缺少的关键步骤。下面是完整的实现代码:
步骤1:准备原始数据(如果还没创建)
import pandas as pd # 构建你的原始DataFrame df = pd.DataFrame({ 'A': [254,254,253,253,253,252,251,251,251,251,250,250,250,250,250], 'B': [1.2,0.9,2,1.8,1.9,1.5,1.2,1.7,1.8,1.6,0.9,0.95,1.1,1.11,1] })
步骤2:添加分组内的行序号
给每个A对应的B值按出现顺序分配一个唯一的行ID,这样后续转宽格式时能准确定位每行数据:
df['row_id'] = df.groupby('A').cumcount()
步骤3:转置为目标格式
使用pivot方法,以行ID为索引、A的值为列名、B的值为填充内容,最后去掉行ID索引:
# 执行pivot转换 result_df = df.pivot(index='row_id', columns='A', values='B').reset_index(drop=True) # 将NaN替换为空字符串(和你示例中的格式一致) result_df = result_df.fillna('')
运行后得到的result_df就是你想要的格式:
| 254 | 253 | 252 | 251 | 250 |
|---|---|---|---|---|
| 1.2 | 2 | 1.5 | 1.2 | 0.9 |
| 0.9 | 1.8 | 1.7 | 0.95 | |
| 1.9 | 1.8 | 1.1 | ||
| 1.6 | 1.11 | |||
| 1 |
为什么之前的方法不生效?
dataframe.T是直接转置整个DataFrame,完全不符合分组转列的需求;- 直接用
pivot会因为A列存在重复值而无法生成唯一的索引-列组合,导致报错或自动聚合; melt是宽格式转长格式的工具,和你的需求正好相反。
内容的提问来源于stack exchange,提问作者morelloking
相关产品推荐
相关产品推荐

