使用基于密钥的最新数据替换DataFrame行

时间:2016-09-27 21:39:28

标签: date pandas dataframe

我有一个如下所示的数据框:

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的行被更新的日期替换)。

我知道这是相当深奥的,但我想我可以把这一切都反过来,因为我一直试图想出一个简单的方法来做这件事。

1 个答案:

答案 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