Pandas - 按月求累积和?
我有一个数据表,长得像这样:
Date n
2014-02-27 4
2014-02-28 5
2014-03-01 1
2014-03-02 6
2014-03-03 7
我想把它变成这样:
Date n csn
2014-02-27 4 4
2014-02-28 5 9
2014-03-01 1 1
2014-03-02 6 7
2014-03-03 7 14
也就是说,我想要一列显示每个月的累计总和,并且每个月都要从头开始。我要怎么做呢?
2 个回答
4
如果你在做时间序列的工作,我建议使用一个叫做DatetimeIndex的东西。在这个例子中,你可以用一个叫TimeGrouper的工具按月份进行分组(这就像按年和月份来分组,类似于重新采样的操作):
In [11]: g = df.groupby(pd.TimeGrouper('M'))
In [12]: g['n'].cumsum()
Out[12]:
Date
2014-02-27 4
2014-02-28 9
2014-03-01 1
2014-03-02 7
2014-03-03 14
dtype: int64
In [13]: df['csn'] = g['n'].cumsum()
注意:如果你还没有使用DatetimeIndex,可以使用to_datetime
这个函数来转换时间,然后设置索引:
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
10
使用 .groupby()
方法时,不要仅仅按月份分组,而是要按年和月份一起分组。否则,像 2013-02
和 2014-02
这样的数据会被放在同一个组里。
In [96]:
df['Month']=df['Date'].apply(lambda x: x[:7])
In [97]:
df['csn']=df.groupby(['Month'])['n'].cumsum()
In [98]:
print df
Date n Month csn
0 2014-02-27 4 2014-02 4
1 2014-02-28 5 2014-02 9
2 2014-03-01 1 2014-03 1
3 2014-03-02 6 2014-03 7
4 2014-03-03 7 2014-03 14
[5 rows x 4 columns]