[英]Creating of new columns in pandas.DataFrame using apply() function
[英]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.