将名称中带有日期的列转换为Python中的单独行

时间:2019-11-08 13:42:58

标签: python pandas data-transform

我已经得到this question in 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 个答案:

答案 0 :(得分:2)

public Word2Vec getWord2Vec() { File gModel = new File("C:/Users/user/Desktop/GoogleNews-vectors-negative300.bin.gz"); return WordVectorSerializer.readWord2VecModel(gModel); } 的{​​{3}}与MultiIndex一起使用,然后通过Series.str.split重塑形状,最后使用DataFrame.unstackSeries.reset_index清理数据:

expand=True

感谢@Jon Clements的另一个解决方案:

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

替代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

答案 1 :(得分:1)

DataFrame.stackDataFrame.popSeries.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