如何在Pandas DataFrame中实现宽表转长表(透视转换)
Pandas DataFrame 宽表转长表实现方法
原始DataFrame结构
import pandas as pd df = pd.DataFrame({ 'Id': ['123', 'abc', 'def'], 'Phone': ['12345', '45678', '78019'], 'Email': ['123@1233.de', 'abc@ab.de', 'def@def.de'], 'workplace': ['test', 'test', 'test'], 'Mailing city': ['New York', 'New York', 'New York'], 'Mailing Stat': ['New York', 'New York', 'New York'] })
对应的表格展示:
| Id | Phone | workplace | Mailing city | Mailing Stat | |
|---|---|---|---|---|---|
| 123 | 12345 | 123@1233.de | test | New York | New York |
| abc | 45678 | abc@ab.de | test | New York | New York |
| def | 78019 | def@def.de | test | New York | New York |
期望转换后的结构
| id | Attribute | Value | Mailing city | Mailing sat |
|---|---|---|---|---|
| 123 | Phone | 12345 | New York | New York |
| 123 | 123@1233.de | New York | New York | |
| 123 | workplace | test | New York | New York |
| abc | Phone | 45678 | New York | New York |
| abc | abc@ab.de | New York | New York | |
| abc | workplace | test | New York | New York |
实现代码
用Pandas内置的melt函数就能快速完成这个转换,代码如下:
# 执行宽转长转换 result_df = df.melt( id_vars=['Id', 'Mailing city', 'Mailing Stat'], # 保留不参与转换的列 value_vars=['Phone', 'Email', 'workplace'], # 需要转为键值对的列 var_name='Attribute', # 转换后的属性列名 value_name='Value' # 转换后的属性值列名 ) # 调整列名匹配期望格式 result_df = result_df.rename(columns={ 'Id': 'id', 'Mailing Stat': 'Mailing sat' }) # 重置索引(可选操作) result_df = result_df.reset_index(drop=True)
关键说明
melt是Pandas专门处理宽表转长表的工具,核心逻辑是区分「保留列」和「转换列」,自动将转换列拆分为属性-值的配对形式。- 最后通过
rename调整列名,完全匹配你需要的输出格式。
内容的提问来源于stack exchange,提问作者Rohit Kulkarni
相关产品推荐
相关产品推荐

