我有一个如下所示的数据框:
user_id val date
1 10 2015-02-01
1 11 2015-01-01
2 12 2015-03-01
2 13 2015-02-01
3 14 2015-03-01
3 15 2015-04-01
我需要运行一个函数来计算(让我们说)日期按时间顺序排列的val之和。如果用户具有更新的日期,请使用该日期,但如果没有,请保留较旧的日期。
例如。如果我使用日期2015-03-15运行该函数,那么该表将是:
user_id val date
1 10 2015-02-01
2 12 2015-03-01
3 14 2015-03-01
给我一笔36美元。
如果我使用日期2015-04-15运行该函数,则该表将为:
user_id val date
1 10 2015-02-01
2 12 2015-03-01
3 15 2015-04-01
(用户3的行被更新的日期替换)。
我知道这是相当深奥的,但我想我可以把这一切都反过来,因为我一直试图想出一个简单的方法来做这件事。
答案 0 :(得分:2)
试试这个:
In [36]: df.loc[df.date <= '2015-03-15']
Out[36]:
user_id val date
0 1 10 2015-02-01
1 1 11 2015-01-01
2 2 12 2015-03-01
3 2 13 2015-02-01
4 3 14 2015-03-01
In [39]: df.loc[df.date <= '2015-03-15'].sort_values('date').groupby('user_id').agg({'date':'last', 'val':'last'}).reset_index()
Out[39]:
user_id date val
0 1 2015-02-01 10
1 2 2015-03-01 12
2 3 2015-03-01 14
或:
In [40]: df.loc[df.date <= '2015-03-15'].sort_values('date').groupby('user_id').last().reset_index()
Out[40]:
user_id val date
0 1 10 2015-02-01
1 2 12 2015-03-01
2 3 14 2015-03-01
In [41]: df.loc[df.date <= '2015-04-15'].sort_values('date').groupby('user_id').last().reset_index()
Out[41]:
user_id val date
0 1 10 2015-02-01
1 2 12 2015-03-01
2 3 15 2015-04-01