我是编码新手,我希望得到帮助,使用 Pandas 将宽格式的数据转换为长格式。
但是使用 pd.wide_to_long
没有达到我想要的输出
我有什么:
但是我需要这种格式:
How it should look in Long format
我已经尝试过 pd.wide_to_long(df, ['quarter_'],'Deal_Number', 'quarter_to_date')
但它给我的最好的结果是 'quarter_to_date' 列仅从 0 到4 且不包括负数(-4 到 -1)
我还尝试将带有双下划线“__”的列重命名为“_-”,但它仍然不包含它们。
无法弄清楚如何做到这一点,甚至尝试将 suffix='\w|\d+'
添加到函数中。
最佳答案
不幸的是,wide_to_long
不支持负值,因此需要其他解决方案。
#change column names
df = (df.rename(columns={'quarter':'quarter_0'})
.rename(columns = lambda x: x.replace('__','_-')))
#create MultiIndex with column with no quarters
df = df.set_index(['Deal_Number','AcquierName_clean'])
#create MultiIndex in columns
df.columns = df.columns.str.split('_', expand=True)
#reshape by stack
df = df.stack().reset_index().rename(columns={'level_2':'quarter_'})
#convert column to integers
df['quarter_'] = df['quarter_'].astype(int)
#if necessary sorting
df = df.sort_values(['Deal_Number','AcquierName_clean','quarter_'])
<小时/>
print (df)
Deal_Number AcquierName_clean quarter_ quarter
3 0 BankA -4 198009
2 0 BankA -3 198012
1 0 BankA -2 198103
0 0 BankA -1 198106
4 0 BankA 0 198109
5 0 BankA 1 198112
6 0 BankA 2 198203
7 0 BankA 3 198206
8 0 BankA 4 198209
12 1 BankB -4 198106
11 1 BankB -3 198109
10 1 BankB -2 198112
9 1 BankB -1 198203
13 1 BankB 0 198206
14 1 BankB 1 198209
15 1 BankB 2 198212
16 1 BankB 3 198303
17 1 BankB 4 198306
21 2 BankC -4 198206
20 2 BankC -3 198209
19 2 BankC -2 198212
18 2 BankC -1 198303
22 2 BankC 0 198306
23 2 BankC 1 198309
24 2 BankC 2 198312
25 2 BankC 3 198403
26 2 BankC 4 198406
关于python - pandas 将宽数据更改为长数据,后缀从负数变为正数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131210/