2016-12-14 5 views
3

Ich habe ein Datenframe mit 40 Millionen Datensätze und ich muss 2 neue Spalten (net_amt und share_amt) aus bestehenden amt und sharing_pct Spalten erstellen. Ich habe zwei Funktionen erstellt, die diese Beträge berechnen und dann die Funktion apply verwenden, um sie wieder in den Datenrahmen zu bringen. Da mein Datenrahmen groß ist, benötigt er mehr Zeit. Können wir beiden Beträge bei einem Schuss berechnen oder ist es völlig ein besserer Weg, es zu tunPython Pandas - mit Apply Function und Erstellen neuer Spalten in Dataframe

def fn_net(row): 
    if (row['sharing']== 1): 
     return row['amt'] * row['sharing_pct'] 
    else: 
     return row['amt'] 

def fn_share(row): 
    if (row['sharing']== 1): 
     return (row['amt']) * (1- row['sharing_pct']) 
    else: 
     return 0 

df_load['net_amt'] = df_load.apply (lambda row: fn_net (row),axis=1) 
df_load['share_amt'] = df_load.apply (lambda row: fn_share (row),axis=1) 
+0

können Sie überprüfen die [Series.where] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.where.html) -Funktion. – Psidom

Antwort

0

Ich denke numpy where() hier die beste Wahl (nach import numpy as np) sein wird:

df['net_amount'] = np.where(df['sharing']==1,    # test/condition 
          df['amt']*df['sharing_pct'], # value if True 
          df['amt'])     # value if False 

können Sie, Verwenden Sie diese Methode natürlich auch für 'share_amt'. Ich denke nicht, dass es einen schnelleren Weg dafür gibt, und ich denke nicht, dass Sie es in "einem Schuss" tun können, abhängig davon, wie Sie es definieren. Fazit: Mit np.where geht es viel schneller als mit einer Funktion.

Genauer gesagt, ich habe in der Probe Datensatz unten getestet (10.000 Zeilen) und es ist etwa 700x schneller als die Funktion/Methode anwenden in diesem Fall.

df=pd.DataFrame({ 'sharing':[0,1]*5000, 
        'sharing_pct':np.linspace(.01,1.,10000), 
        'amt':np.random.randn(10000) }) 
+0

Coding es Ihren Weg lief ~ 30 min. Problem gelöst danke John :) – Pradeep

+0

Cool, froh, es hat funktioniert! – JohnE

Verwandte Themen