Панды, изменяющие широкие данные на длинные с суффиксами от отрицательных до положительных чисел - PullRequest
0 голосов
/ 03 ноября 2018

Я новичок в кодировании, и я хотел бы помочь преобразовать данные в широком формате в длинный формат с помощью Pandas. Однако использование pd.wide_to_long не дало желаемого результата

Что у меня есть:

Как это выглядит в широкоформатном формате

Однако мне нужно это в этом формате:

Как это должно выглядеть в длинном формате

Я пытался pd.wide_to_long(df, ['quarter_'],'Deal_Number', 'quarter_to_date'), однако лучшее, что он мне дает, это столбец 'quar_to_date', который идет только от 0 до 4 и не включает отрицательные значения (от -4 до -1)

Я также попытался переименовать столбцы с двойным подчеркиванием '__' в '_-', но они по-прежнему не включают их.

Не могу понять, как это сделать, даже пытался добавить suffix='\w|\d+' в функцию.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

К сожалению, отрицательные значения не поддерживаются в 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
0 голосов
/ 03 ноября 2018

Попробуйте использовать 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

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...