我有一个包含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)
答案 0 :(得分:0)
我认为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) })