2017-02-10 4 views
1

Ich versuche, eine neue Spalte in einem vorhandenen Datenrahmen zu erstellen, basierend auf der Auswertung, ob Werte jemals in zwei Spalten existieren.Pandas Multicolumn-Auswertung zum Generieren einer neuen Spalte

Angenommen, der folgende Teil eines mittleren Datensatzes (30 Millionen Datenpunkte) ist:

DATE  |ID |3_DAY_FUTURE 
2016-12-14|Bob123|2016-12-17 
2016-12-15|Bob123|2016-12-18 
2016-12-16|Bob123|2016-12-19 
2016-12-17|Bob123|2016-12-20 
2016-12-18|Bob123|2016-12-21 
2016-12-19|Bob123|2016-12-22 
2016-12-20|Bob123|2016-12-23 
2017-01-14|Jim123|2017-01-17 
2017-01-15|Jim123|2017-01-18 
2017-01-16|Jim123|2017-01-19 
2017-01-17|Jim123|2017-01-20 
2017-01-18|Jim123|2017-01-21 
2017-01-19|Jim123|2017-01-22 
2017-01-20|Jim123|2017-01-23 

Ich suche eine Spalte zu erstellen, die jeder ID (Bob und Jim in diesem Beispiel) bewertet, ob hat ein Datumswert, der 3 Tagen in der Zukunft entspricht. Zum Beispiel war Bob123 am 14.12.2016 und 17.12.2016 anwesend, da beide DATEs mit ihm assoziiert sind. Die erste Zeile würde eine neue Spalte hinzufügen, die Ja oder so ähnlich sagt. Hier ist ein Beispiel für die Ausgabe Ich hoffe, suche mit einem neuen 3_DAY_STATUS Spalten:

DATE  |ID |3_DAY_FUTURE|3_DAY_STATUS 
2016-12-14|Bob123|2016-12-17|YES 
2016-12-15|Bob123|2016-12-18|YES 
2016-12-16|Bob123|2016-12-19|YES 
2016-12-17|Bob123|2016-12-20|YES 
2016-12-18|Bob123|2016-12-21|NO 
2016-12-19|Bob123|2016-12-22|No 
2016-12-20|Bob123|2016-12-23|NO 
2017-01-14|Jim123|2017-01-17|YES 
2017-01-15|Jim123|2017-01-18|YES 
2017-01-16|Jim123|2017-01-19|YES 
2017-01-17|Jim123|2017-01-20|YES 
2017-01-18|Jim123|2017-01-21|NO 
2017-01-19|Jim123|2017-01-22|NO 
2017-01-20|Jim123|2017-01-23|NO 

Irgendwelche Vorschläge sehr geschätzt werden.

Antwort

2

Erstellen Maske von groupby von ID mit isin und dann neue Werte hinzufügen, indem numpy.where:

df.DATE = pd.to_datetime(df.DATE) 
df['3_DAY_FUTURE'] = pd.to_datetime(df['3_DAY_FUTURE']) 

mask = df.groupby('ID').apply(lambda x: x['3_DAY_FUTURE'].isin(df.DATE)).values 
print (mask) 
[ True True True True False False False True True True True False 

df['3_DAY_STATUS'] = np.where(mask, 'YES', 'NO') 
print (df) 
     DATE  ID 3_DAY_FUTURE 3_DAY_STATUS 
0 2016-12-14 Bob123 2016-12-17   YES 
1 2016-12-15 Bob123 2016-12-18   YES 
2 2016-12-16 Bob123 2016-12-19   YES 
3 2016-12-17 Bob123 2016-12-20   YES 
4 2016-12-18 Bob123 2016-12-21   NO 
5 2016-12-19 Bob123 2016-12-22   NO 
6 2016-12-20 Bob123 2016-12-23   NO 
7 2017-01-14 Jim123 2017-01-17   YES 
8 2017-01-15 Jim123 2017-01-18   YES 
9 2017-01-16 Jim123 2017-01-19   YES 
10 2017-01-17 Jim123 2017-01-20   YES 
11 2017-01-18 Jim123 2017-01-21   NO 
12 2017-01-19 Jim123 2017-01-22   NO 
13 2017-01-20 Jim123 2017-01-23   NO 
+0

Danke @jezrael. Funktioniert mit kleineren Datasets, aber es dauert wirklich Stunden im gesamten Dataset, da nur auf einem Prozessor gearbeitet wird. Diese Zeile im Einzelnen: mask = df.groupby ('ID'). Apply (Lambda x: x ['3_DAY_FUTURE']. Isin (df.DATE)). Werte – echoecho256

+0

Ja, es ist ein bisschen problematisch mit der Leistung. Was ist mit der zweiten Antwort? – jezrael

+0

Die zweite Antwort scheint die Segmentierung oder Gruppierung nach ID nicht zu berücksichtigen. scheint nur nach einem Offset zu suchen, unabhängig davon, ob die ID immer noch dieselbe ist – echoecho256

1

Verwendung shift(-3) und np.where

df['3_DAY_STATUS'] = np.where(df.DATE.shift(-3) == df['3_DAY_FUTURE'], 'YES', 'NO') 
print(df) 

     DATE  ID 3_DAY_FUTURE 3_DAY_STATUS 
0 2016-12-14 Bob123 2016-12-17   YES 
1 2016-12-15 Bob123 2016-12-18   YES 
2 2016-12-16 Bob123 2016-12-19   YES 
3 2016-12-17 Bob123 2016-12-20   YES 
4 2016-12-18 Bob123 2016-12-21   NO 
5 2016-12-19 Bob123 2016-12-22   NO 
6 2016-12-20 Bob123 2016-12-23   NO 
7 2017-01-14 Jim123 2017-01-17   YES 
8 2017-01-15 Jim123 2017-01-18   YES 
9 2017-01-16 Jim123 2017-01-19   YES 
10 2017-01-17 Jim123 2017-01-20   YES 
11 2017-01-18 Jim123 2017-01-21   NO 
12 2017-01-19 Jim123 2017-01-22   NO 
13 2017-01-20 Jim123 2017-01-23   NO 

+0

Dank. Ich habe Ihr Snippet ausprobiert, aber es scheint verschiedene IDs nicht zu berücksichtigen – echoecho256

Verwandte Themen