Преобразование столбцов с датой в именах в отдельные строки в Python - PullRequest
1 голос
/ 08 ноября 2019

Я уже получил ответ на этот вопрос в R , задаваясь вопросом, как это можно реализовать в Python.

Допустим, у нас есть пандас DataFrame, подобный этому:

import pandas as pd
d = pd.DataFrame({'2019Q1':[1], '2019Q2':[2], '2019Q3':[3]})

, который выглядит следующим образом:

   2019Q1  2019Q2  2019Q3
0       1       2       3

Как я могу преобразовать его в такой вид:

Year    Quarter    Value
2019    1          1
2019    2          2
2019    3          3

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Используйте Series.str.split для MultiIndex с expand=True, а затем измените форму на DataFrame.unstack, последняя очистка данных с помощью Series.reset_index иSeries.rename_axis:

d = pd.DataFrame({'2019Q1':[1], '2019Q2':[2], '2019Q3':[3]})

d.columns = d.columns.str.split('Q', expand=True)
df = (d.unstack(0)
       .reset_index(level=2, drop=True)
       .rename_axis(('Year','Quarter'))
       .reset_index(name='Value'))
print (df)
   Year Quarter  Value
0  2019       1      1
1  2019       2      2
2  2019       3      3

Спасибо @Jon Clements за другое решение:

df = (d.melt()
       .variable
       .str.extract('(?P<Year>\d{4})Q(?P<Quarter>\d)')
       .assign(Value=d.T.values.flatten()))
print (df)
   Year Quarter  Value
0  2019       1      1
1  2019       2      2
2  2019       3      3

Альтернатива с split:

df = (d.melt()
       .variable
       .str.split('Q', expand=True)
       .rename(columns={0:'Year',1:'Quarter'})
       .assign(Value=d.T.values.flatten()))
print (df)
   Year Quarter  Value
0  2019       1      1
1  2019       2      2
2  2019       3      3
1 голос
/ 08 ноября 2019

Использование DataFrame.stack с DataFrame.pop и Series.str.split:

df = d.stack().reset_index(level=1).rename(columns={0:'Value'})
df[['Year', 'Quarter']] = df.pop('level_1').str.split('Q', expand=True)
   Value  Year Quarter
0      1  2019       1
0      2  2019       2
0      3  2019       3

ЕслиВы заботитесь о порядке столбцов, используйте reindex:

df = df.reindex(['Year', 'Quarter', 'Value'], axis=1)
   Year Quarter  Value
0  2019       1      1
0  2019       2      2
0  2019       3      3
...