Pandas - 按月求累积和?

6 投票
2 回答
8782 浏览
提问于 2025-04-17 21:40

我有一个数据表,长得像这样:

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-022014-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]

撰写回答