我有一个数据框,代表玩家在游戏中的得分,按时间索引:
player_id
2016-03-01 873970260
2016-03-02 8470693237
2016-03-02 221785899
2016-03-03 569452661
2016-03-04 221785899
2016-03-04 8276343674
我想添加一个新的列,其中包含一个布尔值,表示player\u id
是否在时间序列中第一次出现:
player_id new_player
day
2016-03-01 873970260 True
2016-03-02 8470693237 True
2016-03-02 221785899 True
2016-03-03 569452661 True
2016-03-04 221785899 False
2016-03-04 8276343674 True
True
表示“以前从未见过”,False
表示“过去已经得分”。
最快的方法是什么?在切片上使用isin
(即比较dataframe[day]
到dataframe[: day-1]
)?
以下是我如何构建示例数据框架:
import pandas as pd
import datetime as dt
gamedf = pd.DataFrame([873970260,8470693237,221785899,569452661,221785899,8276343674],
columns=['player_id'],
index=[dt.datetime(2016, 3, 1), dt.datetime(2016, 3, 2), dt.datetime(2016, 3, 2), dt.datetime(2016, 3, 3), dt.datetime(2016, 3, 4), dt.datetime(2016, 3, 4)])
使用duplicated
创建一系列重复的布尔值,并使用~
反转:
In [72]:
df['new_player'] = ~df['player_id'].duplicated()
df
Out[72]:
player_id new_player
day
2016-03-01 873970260 True
2016-03-02 8470693237 True
2016-03-02 221785899 True
2016-03-03 873970260 False
2016-03-03 423970290 True
2016-03-04 221785899 False
2016-03-04 8276343674 True
使用您的gamedf
代码:
In [74]:
gamedf['new_player'] = ~gamedf['player_id'].duplicated()
gamedf
Out[74]:
player_id new_player
2016-03-01 873970260 True
2016-03-02 8470693237 True
2016-03-02 221785899 True
2016-03-03 569452661 True
2016-03-04 221785899 False
2016-03-04 8276343674 True