我有一个如下所示的数据框:
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
...即。我想要一个月内运行总计的列,我想让它从每个月开始。我怎么能这样做?
答案 0 :(得分:6)
使用.groupby()
,但不要只按月分组,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]
答案 1 :(得分: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)