将宽数据转换为后缀从负数到正数的长数据

2021-10-17 17:50:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新的编码,我想帮助转换数据在一个广泛的格式到长格式使用熊猫。 但是使用pd.wide_to_long并没有达到我想要的输出

我所拥有的:

How it looks in Wide format

但是我需要这种格式:

How it should look in Long format

我试过pd.wide_to_long(df, ['quarter_'],'Deal_Number', 'quarter_to_date')但是它给我的最好的结果是'quarter\u to\u date'列只从0到4,不包括负数(-4到-1)

我还尝试过将带有双下划线“\uuuu”的列重命名为“\uuu-”,但仍然不包括它们。你知道吗

我想不出该怎么做,甚至试着将suffix='\w|\d+'添加到函数中。你知道吗

2条回答
网友
1楼 ·

不幸的是,负值在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
网友
2楼 ·

尝试使用pd.melt。你知道吗

我已经取了你发布的数据帧的一个样本,并试图产生结果。您可以对所有列执行此操作:

下面是我使用的数据帧:

In [970]: df
Out[970]: 
  Acquirer  Deal_Number  quarter  quarter_1  quarter_2
0   Bank A            0   198109     198106     198103
1   Bank B            1   198206     198203     198112
2   Bank C            2   198306     198303     198212

In [969]: pd.melt(df,id_vars=['Deal_Number','Acquirer'], var_name='quarter', value_name="values").sort_values('Deal_Number').replace({'quarter'
     ...: :{'quarter':0, 'quarter_1': -1, 'quarter_2': -2, 'quarter_3': -3, 'quarter_4': -4}})

Out[969]: 
   Deal_Number Acquirer  quarter  values
0            0   Bank A        0  198109
3            0   Bank A       -1  198106
6            0   Bank A       -2  198103
1            1   Bank B        0  198206
4            1   Bank B       -1  198203
7            1   Bank B       -2  198112
2            2   Bank C        0  198306
5            2   Bank C       -1  198303
8            2   Bank C       -2  198212

如果这有帮助,请告诉我。你知道吗

相关问题