2016-11-05 8 views
1

Ich habe einen Datenrahmen ‚df_ret_temp‘Warum dataframe.appy Kosten zu viel Zeit

enter image description here

enter image description here Ich möchte die Spalte accMonth Werte einzustellen. Es gibt Codes schnell

laufen
df_ret_temp.loc[df_ret_temp['tradeDate'].str[5:7]<='03','accMonth']=df_ret_temp['tradeDate'].str[0:4].apply(lambda x:str(int(x)-1))+'12' 
df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='06') & 
       (df_ret_temp['tradeDate'].str[5:7]>'03'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'03' 

df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='09') & 
       (df_ret_temp['tradeDate'].str[5:7]>'06'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'06' 

df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='12') & 
       (df_ret_temp['tradeDate'].str[5:7]>'09'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'09' 

Allerdings, wenn ich Funktion anwenden, die Spalte zu viel Zeit accMonth Werte.Verfahren Codes zu kosten.

def df_ret_tempFun(row): 
    if row['tradeDate'][5:7]<='03': 
     row['accMonth']=str(int(row['tradeDate'][0:4])-1)+'12' 
    elif row['tradeDate'][5:7]<='06' and row['tradeDate'][5:7]>'03': 
     row['accMonth']=row['tradeDate'][0:4]+'03' 
    elif row['tradeDate'][5:7]<='09' and row['tradeDate'][5:7]>'06': 
     row['accMonth']=row['tradeDate'][0:4]+'06' 
    else: 
     row['accMonth']=row['tradeDate'][0:4]+'09' 
    return row 
df_ret_temp=df_ret_temp.apply(df_ret_tempFun,axis=1) 

Warum hat die Anwendungsfunktion eine geringere Leistung?

Antwort

2

.apply(..., axis=1) ist eine for x in df.iter* Schleife unter der Haube, es ist so nicht vektorisiert und deshalb ist sehr langsam.

Aber Ihre Frage ist ein sehr gutes Beispiel für eine XY problem

Hier ist eine Pandas Lösung für Ihre „nicht gefragt“ ;-) Frage:

In [33]: x 
Out[33]: 
     Date 
0 2007-01-01 
1 2007-04-02 
2 2007-08-03 
3 2007-11-04 

In [34]: x.dtypes 
Out[34]: 
Date object 
dtype: object 

zuerst sicherstellen, dass Ihre Date Spalte von datetime dtype:

In [35]: x.Date = pd.to_datetime(x.Date) 

In [36]: x.dtypes 
Out[36]: 
Date datetime64[ns] 
dtype: object 

Vectorized Lösung:

In [37]: x['accMonth'] = pd.PeriodIndex(pd.PeriodIndex(df.Date, freq='Q') - 1, freq='3M') 

In [38]: x 
Out[38]: 
     Date accMonth 
0 2007-01-01 2006-12 
1 2007-04-02 2007-03 
2 2007-08-03 2007-06 
3 2007-11-04 2007-09