Pandas数据框架:将索引更改为年份,列更改为月份。

3

目前我正在使用quandl从FRED获取一些数据。

我收到的数据是一个数据帧。

它当前返回的格式如下:

DATE    VALUE
1966-01-01  31.880
1966-02-01  32.080
1966-03-01  32.180
1966-04-01  32.280
... ...
2013-08-01  233.323
2013-09-01  233.632
2013-10-01  233.718
2013-11-01  234.121

但是我想重新组织以便于显示为:

        Jan     Feb     Mar     Apr...
1966    31.880  32.080  32.180  32.280
...
2013    233.323 233.632 233.718 234.121

编辑:我认为这会很有用。

DatetimeIndex(['1966-01-01', '1966-02-01', '1966-03-01', '1966-04-01',
               '1966-05-01', '1966-06-01', '1966-07-01', '1966-08-01',
               '1966-09-01', '1966-10-01',
               ...
               '2015-04-01', '2015-05-01', '2015-06-01', '2015-07-01',
               '2015-08-01', '2015-09-01', '2015-10-01', '2015-11-01',
               '2015-12-01', '2016-01-01'],
              dtype='datetime64[ns]', name=u'DATE', length=601, freq=None)
Index([u'VALUE'], dtype='object')
2个回答

3
您可以使用 pandas.crosstab
df.DATE = pd.to_datetime(df.DATE)    # optional if the DATE column is already datetime type

pd.crosstab(df.DATE.dt.year, 
            df.DATE.dt.strftime("%b"), 
            df.VALUE, 
            aggfunc="sum",
            rownames=["Year"],
            colnames=["Month"])

在此输入图片描述

更新:如果你的索引是日期:

pd.crosstab(df.index.year, 
            df.index.strftime("%b"), 
            df.VALUE, 
            aggfunc="sum",
            rownames=["Year"],
            colnames=["Month"])

我认为这不会起作用,因为DATE是索引而不是列。 - user3093175
如果DATE是索引,可以使用df.index代替df.DATE.dt,请参阅更新。 - Psidom
谢谢Psidom。我对Pandas还有点陌生,需要记忆很多成员方法。 - user3093175
嗨,Psidom,有没有办法确保月份的顺序保持不变?我知道这不会影响图表,但按字母顺序排列的月份看起来不太好。 - user3093175
再次感谢您,您的帮助非常大。 - user3093175
显示剩余2条评论

1
我喜欢使用pd.Seriesunstack来构建这个。
pd.Series(
    df.VALUE.values,
    [df.DATE.dt.year.values,
     df.DATE.dt.strftime("%b").values]
).unstack()

        Apr      Aug    Feb    Jan    Mar      Nov      Oct      Sep
1966  32.28      NaN  32.08  31.88  32.18      NaN      NaN      NaN
2013    NaN  233.323    NaN    NaN    NaN  234.121  233.718  233.632

或者等价地使用:
df.set_index(
    [df.DATE.dt.year,
     df.DATE.dt.strftime('%b')],
).VALUE.rename_axis([None, None]).unstack()

naive timing

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接