熊猫:每个身份证上次活动以来的天数

时间:2018-01-21 15:59:13

标签: pandas

我想为我的dataframe df['days_since_last']构建一个列,显示每个player_id的每个event_id的上一次匹配后的天数,如果该行是该玩家的第一个匹配则为nan在数据集中。

我的数据示例:

   event_id  player_id  match_date
0   1470993     227485  2015-11-29
1   1492031     227485  2016-07-23
2   1489240     227485  2016-06-19
3   1495581     227485  2016-09-02
4   1490222     227485  2016-07-03
5   1469624     227485  2015-11-14
6   1493822     227485  2016-08-13
7   1428946     313444  2014-08-10
8   1483245     313444  2016-05-21
9   1472260     313444  2015-12-13

我尝试了Find days since last event pandas dataframe中的代码但得到了荒谬的结果。

2 个答案:

答案 0 :(得分:2)

似乎你需要先排序:

df['days_since_last_event'] = (df.sort_values(['player_id','match_date'])
                                 .groupby('player_id')['match_date'].diff()
                                 .dt.days)
print (df)
   event_id  player_id match_date  days_since_last_event
0   1470993     227485 2015-11-29                   15.0
1   1492031     227485 2016-07-23                   20.0
2   1489240     227485 2016-06-19                  203.0
3   1495581     227485 2016-09-02                   20.0
4   1490222     227485 2016-07-03                   14.0
5   1469624     227485 2015-11-14                    NaN
6   1493822     227485 2016-08-13                   21.0
7   1428946     313444 2014-08-10                    NaN
8   1483245     313444 2016-05-21                  160.0
9   1472260     313444 2015-12-13                  490.0

答案 1 :(得分:1)

演示:

In [174]: df['days_since_last'] =  (df.groupby('player_id')['match_date']
                                      .transform(lambda x: (x.max()-x).dt.days))

In [175]: df
Out[175]:
   event_id  player_id match_date  days_since_last
0   1470993     227485 2015-11-29              278
1   1492031     227485 2016-07-23               41
2   1489240     227485 2016-06-19               75
3   1495581     227485 2016-09-02                0
4   1490222     227485 2016-07-03               61
5   1469624     227485 2015-11-14              293
6   1493822     227485 2016-08-13               20
7   1428946     313444 2014-08-10              650
8   1483245     313444 2016-05-21                0
9   1472260     313444 2015-12-13              160