2016-04-18 5 views
3

Ich habe 2 Listen:Elemente von Listen hinzufügen, wo Spiel (Python) stammt

vals = [1,2,3,4] 
dates = [t1, t2, t3, t4] 

wo Daten in Python Datetime-Format.

Dann gegeben, ein weiterer Satz von Listen:

vals_2 = [1, 1, 2, 2] 
dates_2 = [t5,t6,t7,t8] 

Es könnte sein, dass t6 = t1 usw.

Jetzt würde ich vals und vals_2 hinzufügen, wo die Daten übereinstimmen (so hinzufügen vals[i] und vals_2[j] wenn dates[i] == dates_2[j]).

Ich möchte eine effiziente Lösung.

Meine Idee so weit: Put vals in einem Pandas Datenrahmen, dann in einem separaten Datenrahmen setzen vals_2 und die zwei am Tag Schlüssel fusionieren?

Frage: Ist das eine gute (/ die beste) Idee? Ich bin nicht sicher, wie genau mit dieser gegebenen Datetime-Format behandeln usw., so dass einige Hinweise, wie, um loszulegen würde

Dank

+0

Sie könnten auch ein einfaches Wörterbuch, anstatt dass die Karten Datum Wert von 'vals' oder' vals_2' – poke

+1

Du hast gesagt, verwenden, dass es das 't6 könnte == t1', aber in diesem Fall würden Sie nicht addiere die entsprechenden Werte, weil sie nicht den gleichen Index 'i' haben, oder? – IanS

+0

@IanS Ja das ist ein toller Punkt, vielen Dank für die Korrektur. Ich meine add add vals [i] zu vals_2 [j] wenn Daten [i] == dates_2 [j] für alle i im Bereich 0 bis len (vals) – denvar

Antwort

2

Nach dem Vorbild von dem, was Sie vorgeschlagen:

import datetime as dt 

vals = [1, 2, 3, 4] 
dates = [dt.date(2016,1,n) for n in range(1, 5)] 
vals_2 = [1, 1, 2, 2] 
dates_2 = [dt.date(2016,1,n) for n in range(3, 7)] 

df1 = pd.DataFrame({'date': dates, 'vals': vals}) 
df2 = pd.DataFrame({'date': dates_2, 'vals': vals_2}) 

>>> df1.merge(df2, on='date', suffixes=['_1', '_2']) 

     date vals_1 vals_2 
0 2016-01-03  3  1 
1 2016-01-04  4  1 

Sie können auch die Daten in Zeitstempel umwandeln und tun dann den Vergleich, die schneller etwas sein sollte:

df1['date'] = pd.to_datetime(df1.date) 
df2['date'] = pd.to_datetime(df2.date) 

Timings mit 40k Aufzeichnungen

Pandas Datetime-Objekte verwenden.

%timeit df1.merge(df2, on='date', suffixes=['_1', '_2']) 
1 loops, best of 3: 10.2 s per loop 

Pandas mit Zeitstempeln.

%timeit df1.merge(df2, on='date', suffixes=['_1', '_2']) 
1 loops, best of 3: 9.1 s per loop 
+0

Was ich an diesem mag, ist, dass es Fälle behandeln kann, wo die Daten nicht überschneiden. Ich nehme an, Sie könnten dann NaNs (die aus nicht überlappenden Daten entstehen würden) in Nullen für den Additionsteil umwandeln. – denvar

1

Lassen Sie uns klar sein, sagen, Sie wollen vals_3 zu bekommen, wo ich ein Index ist und vals_3[i] = vals[i] + vals_2[i] wenn dates[i]dates_2[i] gleich, können Sie tun:

vals_3 = [vals[idx]+vals_2[idx] for idx, date in enumerate(dates) if date == dates_2[idx]]