2016-07-19 5 views
2

Ich habe einen Datenrahmen, die Partituren von Spielern in einem Spiel, indiziert durch die Zeit repräsentieren:Erhalten erstes Mal Auftreten in einem Pandas Datenrahmen mit Datumzeit indiziert

   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 

Ich mag eine neue Spalte enthält einen Booleschen hinzufügen in dem es heißt, wenn die player_id zum ersten Mal in der Zeitreihe erscheint:

   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 bedeutet „noch nie gesehen“, False bedeutet „bereits in der Vergangenheit erzielte“.

Was wäre der schnellste Weg? Unter Verwendung von isin auf Scheiben (d. H. Vergleichen von dataframe[day] zu dataframe[:day-1])?

Hier ist, wie ich die Probe Datenrahmen bauen:

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)]) 
+1

Sie haben zusätzliche Zeilen in der zweiten Datafram e. – ayhan

+0

mein Schlechter, gerade repariert es. – chilladx

Antwort

2

Verwendung duplicated eine boolean Reihe der Werte zu erstellen, die Duplikate sind und invertieren ~ mit:

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 

Ihre gamedf Code verwenden:

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 
Verwandte Themen