2017-09-10 10 views
3

Ich habe ein [1.008.961 Zeilen x 8 Spalten] Pandas Datenrahmen wie folgt aussehen:"Sandwich" -Werte in einer Pandas-Dataframe-Spalte?

  Position Price Side Size     time init  dt best_pricejump 
0    1 3542  1 300 1495087206897454000 True 0.000   NaN 
1    2 3541  1 484 1495087206906657000 True 9.203   NaN 
2    3 3540  1 423 1495087206914836000 True 8.179   NaN 
3    4 3539  1 599 1495087206922854000 True 8.018   NaN 
4    5 3539  1 599 1495087206930944000 True 8.018   NaN 

und eine Liste mit bestimmten Scheiben Ich bin auf der Suche:

[slice(0, 5, None), slice(9, 35, None), slice(39, 131, None), slice(135, 141, None),...] 

Wie kann ich „Sandwich“ der Werte von Spalte Zeit effizient, so dass jedes Mal, wenn Wert meines aufgeschnittenen Datenframes ähnlich dem letzten Wert der Scheibe ist?

würde Obiges Beispiel sein: haben

  Position Price Side Size     time init  dt best_pricejump 
0    1 3542  1 300 1495087206930944000 True 0.000   NaN 
1    2 3541  1 484 1495087206930944000 True 9.203   NaN 
2    3 3540  1 423 1495087206930944000 True 8.179   NaN 
3    4 3539  1 599 1495087206930944000 True 8.018   NaN 
4    5 3539  1 599 1495087206930944000 True 8.018   NaN 

ich eine Lösung, aber es ist schrecklich langsam (es buchstäblich 14 Minuten dauert). Gibt es schnellere Wege?

for slc in list_of_slices: 
    df["time"][slc] = (df["time"][slc]).iloc[-1] 

Antwort

1

Sie können Position iloc mit iat für get Skalar versuchen: statt einer Schleife

#get position of column time 
loc = df.columns.get_loc("time") 
for slc in list_of_slices: 
    df.iloc[slc, loc] = df["time"].iat[slc.stop-1] 
+0

Faster um einen Faktor 5, dumm für nicht darüber nachzudenken, iat – Hekri

1

Sie eine Join-Operation versuchen. Obwohl ich nicht persönlich sehen kann, wie Sie einer ursprünglichen Schleife entkommen würden. Beginnen Sie, indem ich den Slicer durchlaufe und jedem Slicer-Bereich eine Gruppe zuweise. Dann erhält man einen Datenrahmen (map_df) nur der Startzeitgruppe. Dann füge ich es wieder hinzu. Ich bin mir eigentlich nicht sicher, ob das schneller geht. Es hängt davon ab, wie lange es dauert, in jeder Schleife zu schneiden, anstatt einen Wert zuzuweisen. Vielleicht kannst du es versuchen und mich auf die eine oder andere Weise wissen lassen?

df['G'] = np.nan 
for n, k in enumerate(slicr): 
    df.ix[df.ix[list(range(k.start,k.stop)),'position'],'G'] = n 

map_df = df.ix[[k.start for k in slicr], ['G', 'time']] 
new_df = pd.merge(df, map_df, on='G', how='left') 
+0

Die Position Spalte (! = Indexverschiebung um 1) ist ein wenig komplexer, so müsste ich Ihre algo ein wenig anpassen – Hekri

Verwandte Themen