需要手动指定标签时将宽数据转换为长数据

问题描述 投票:0回答:1

我有以下数据框:

data = {'POSTING_AMOUNT1': [10,20,30], 'POSTING_AMOUNT2': [100,200,300],
       'POSTING_AMOUNT3': [15,25,35], 'POSTING_AMOUNT4': [20,40,60]}

我的预期输出需要如下:

专栏 发帖_金额
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')
python pandas melt
1个回答
0
投票

一种选择是使用 pandass' Wide_to_long:

df = pd.DataFrame(data)
(pd.wide_to_long(
    df.reset_index(), 
    i = 'index', 
    stubnames='POSTING_AMOUNT', 
    j = 'column')
.reset_index('column')
)
       column  POSTING_AMOUNT
index                        
0           1              10
1           1              20
2           1              30
0           2             100
1           2             200
2           2             300
0           3              15
1           3              25
2           3              35
0           4              20
1           4              40
2           4              60

另一个选择是使用pyjanitor的pivot_longer

# pip install pyjanitor
import janitor
import pandas as pd

df.pivot_longer(names_to = ('.value', 'Column'), names_pattern = r"(.+)(\d)")
   Column  POSTING_AMOUNT
0       1              10
1       1              20
2       1              30
3       2             100
4       2             200
5       2             300
6       3              15
7       3              25
8       3              35
9       4              20
10      4              40
11      4              60
© www.soinside.com 2019 - 2024. All rights reserved.