簡體   English   中英

Python pandas - 使用apply funtion並在dataframe中創建新列

[英]Python pandas - using apply funtion and creating new columns in dataframe

我有一個包含4000萬條記錄的數據框,我需要從現有的amt和sharing_pct列創建2個新列(net_amt和share_amt)。 我創建了兩個計算這些數量的函數,然后使用apply函數將它們填充回數據框。 由於我的數據框很大,因此需要更多時間才能完成。 我們可以一次性計算兩種數量,還是完全有更好的方法

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)

我認為numpy where()將是這里的最佳選擇(在import numpy as np ):

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

當然,您也可以對“share_amt”使用相同的方法。 我認為沒有更快的方法可以做到這一點,我認為你不能在“一次性”中做到這一點,這取決於你如何定義它。 結論:使用np.where操作比應用函數要快。

更具體地說,我測試了下面的樣本數據集(10,000行),在這種情況下,它比函數/ apply方法快約700倍。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM