需手动指定标签时,如何将宽格式数据转换为长格式数据
问题描述
现有如下DataFrame:
data = {'POSTING_AMOUNT1': [10,20,30], 'POSTING_AMOUNT2': [100,200,300], 'POSTING_AMOUNT3': [15,25,35], 'POSTING_AMOUNT4': [20,40,60]}
期望输出表格:
| Column | Posting_Amount |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 1 | 30 |
| 2 | 100 |
| 2 | 200 |
| 2 | 300 |
| 3 | 15 |
| 3 | 25 |
| 3 | 35 |
| 4 | 20 |
| 4 | 40 |
| 4 | 60 |
尝试使用pandas的.melt()函数未成功,错误代码如下:
melted = pd.melt(df, id_vars=[1,2,3,4], value_vars=['POSTING_AMOUNT1', 'POSTING_AMOUNT2', 'POSTING_AMOUNT3', 'POSTING_AMOUNT4'], var_name='Column', value_name='Posting_Amount')
解决方案
错误原因:id_vars参数使用错误,你的DataFrame中不存在名为1、2、3、4的列,且未正确从原列名中提取数字作为Column列的值。
正确实现代码:
import pandas as pd data = {'POSTING_AMOUNT1': [10,20,30], 'POSTING_AMOUNT2': [100,200,300], 'POSTING_AMOUNT3': [15,25,35], 'POSTING_AMOUNT4': [20,40,60]} df = pd.DataFrame(data) # 执行melt,将所有列转为值列 melted = pd.melt(df, value_vars=df.columns, var_name='Column', value_name='Posting_Amount') # 提取列名末尾的数字并转为整数 melted['Column'] = melted['Column'].str.extract(r'(\d+)').astype(int) # 按Column排序以匹配期望输出顺序 melted = melted.sort_values('Column').reset_index(drop=True) print(melted)
执行后即可得到与期望一致的结果。
内容的提问来源于stack exchange,提问作者Rip_027
相关产品推荐
相关产品推荐

