如何转置Pandas DataFrame并保留指定列名?
解决方案
原始数据结构
| Code | Service | Service2 | Service3 |
|---|---|---|---|
| xxy | 23a | 44e | 42e |
| zzy | 22c | 32c | 32z |
| rrr | 21d | 85a | 8m |
期望转换结果
| Code | Service |
|---|---|
| xxy | 23a |
| xxy | 44e |
| xxy | 42e |
| zzy | 22c |
| zzy | 32c |
| zzy | 32z |
| rrr | 21d |
| rrr | 85a |
| rrr | 8m |
转换代码
使用Pandas的melt方法可快速完成宽格式到长格式的转换,代码如下:
import pandas as pd data = {'Code':['xxy','zzy', 'rrr'], 'Service':["23a","22c","21d"], 'Service2':["44e", "32c","85a"], 'Service3':["42e", "32z","8m"], } df = pd.DataFrame(data) # 执行宽转长转换 df_transformed = df.melt( id_vars='Code', # 保留作为标识的列 value_vars=['Service', 'Service2', 'Service3'], # 需要堆叠的列 value_name='Service' # 堆叠后值列的名称 ).drop(columns='variable') # 移除自动生成的原列名标识列 # 按Code排序,匹配期望结果的顺序 df_transformed = df_transformed.sort_values('Code').reset_index(drop=True) print(df_transformed)
代码说明
melt是Pandas专门用于宽表转长表的工具函数,通过id_vars指定无需堆叠的标识列,value_vars指定要堆叠的目标列- 转换后自动生成的
variable列记录原列名,这里不需要该列,因此用drop删除 - 最后通过
sort_values按Code排序,确保结果顺序与示例一致
内容的提问来源于stack exchange,提问作者Thornos
相关产品推荐
相关产品推荐

