Python pandas - 使用apply funtion并在dataframe

时间:2016-12-14 22:26:21

标签: python pandas

我有一个包含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)

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) })