如何将宽格式DataFrame转换为每列对应单行的长格式?
解决方法
原始DataFrame
| - | Name | 0 | 1 | 2 | 3 |
|---|---|---|---|---|---|
| 0 | John | object 1 | object 2 | Object 3 | object 4 |
| 1 | Smith | object 1 | object 2 | Object 3 | object 4 |
| 2 | Jack | object 1 | object 2 | Object 3 | object 4 |
目标格式
| - | Name | 0 |
|---|---|---|
| 0 | John | object1 |
| 1 | John | object2 |
| 2 | John | object3 |
| 3 | John | object4 |
| 4 | Smith | object1 |
| 5 | Smith | object2 |
| 6 | Smith | object3 |
| 7 | Smith | object4 |
| 8 | Jack | object1 |
| 9 | Jack | object2 |
| 10 | Jack | object3 |
| 11 | Jack | object4 |
代码实现
用pandas的melt函数完成宽表转长表,再处理字符串格式:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Name': ['John', 'Smith', 'Jack'], '0': ['object 1', 'object 1', 'object 1'], '1': ['object 2', 'object 2', 'object 2'], '2': ['Object 3', 'Object 3', 'Object 3'], '3': ['object 4', 'object 4', 'object 4'] }) # 宽表转长表,保留Name作为分组列 melted_df = df.melt(id_vars='Name', value_name='0') # 去掉object(含大写开头的Object)后的空格,统一格式 melted_df['0'] = melted_df['0'].str.replace(r'(?i)object\s', 'object', regex=True) # 重置索引并调整列顺序 result_df = melted_df.reset_index(drop=False).rename(columns={'index': '-'})[['-', 'Name', '0']] print(result_df)
步骤说明
- 宽转长:
melt函数把Name列作为标识,将原来的0-3列的所有值整合到新的0列里,自动为每个Name生成多行数据。 - 格式统一:用正则替换去掉
object(不区分大小写)后面的空格,把Object 3这类格式统一成object3。 - 调整索引和列顺序:重置索引并将索引列命名为
-,最后调整列的顺序匹配目标格式。
内容的提问来源于stack exchange,提问作者user14696236
相关产品推荐
相关产品推荐

