【问题标题】:Using conditional statement to subtract scalar from pandas df column gives ValueError: The truth value of a Series is ambiguous使用条件语句从 pandas df 列中减去标量给出 ValueError: The truth value of a Series is ambiguous
【发布时间】:2018-03-31 12:26:02
【问题描述】:

我正在尝试执行:

if df_trades.loc[:, 'CASH'] != 0: df_trades.loc[:, 'CASH'] -= commission

然后我得到错误。 df_trades.loc[:, 'CASH'] 是一列浮点数。我想从该列中的每个条目中减去标量 commission

例如,df_trades.loc[:, 'CASH'] 打印出来

2011-01-10   -2557.0000
2011-01-11       0.0000
2011-01-12       0.0000
2011-01-13   -2581.0000

如果commission1,我想要结果:

2011-01-10   -2558.0000
2011-01-11       0.0000
2011-01-12       0.0000
2011-01-13   -2582.0000

【问题讨论】:

    标签: python pandas scalar truthiness


    【解决方案1】:

    使用np.where

    commission = -1
    df['CASH'] = np.where(df['CASH'] != 0, df['CASH'] + commission , df['CASH'])
    

    df.where

    df['CASH'] = df['CASH'].where(df['CASH'] == 0,df['CASH']+commission)
    

    df.mask

    df['CASH'] = df['CASH'].mask(df['CASH'] != 0 ,df['CASH']+commission)
    
    日期 2011-01-10 -2558.0 2011-01-11 0.0 2011-01-12 0.0 2011-01-13 -2582.0 名称:现金,数据类型:float64
    %%timeit
    commission = -1
    df['CASH'] = np.where(df['CASH'] != 0, df['CASH'] + commission , df['CASH'])
    1000 loops, best of 3: 750 µs per loop
    
    %%timeit
    df['CASH'].mask(df['CASH'] != 0 ,df['CASH']+commission)
    1000 loops, best of 3: 1.45 ms per loop
    
    %%timeit
    df['CASH'].where(df['CASH'] == 0,df['CASH']+commission)
    1000 loops, best of 3: 1.55 ms per loop
    
    %%timeit
    df.loc[df['CASH'] != 0, 'CASH'] += commission
    100 loops, best of 3: 2.37 ms per loop
    

    【讨论】:

    • Numpy 还是 Pandas 更有效?
    • pshep123的解决方案也差不多吗?
    • @dirtysocks45 我添加了时间以便更好地进行速度比较
    • 感谢 Bharath 的时间安排。没想到where() 这么快。去重构几千个.loc[] 语句...
    • 还要感谢 Bharath。你介意分享 Pandas 的方式吗?
    【解决方案2】:

    应该这样做:

    df.loc[df['CASH'] != 0, 'CASH'] -= 1

    【讨论】:

    • 鉴于我使用的是 Pandas 和 Numpy,这是最 Pythonic 的解决方案吗?
    • 我不是 pythonic 代码的仲裁者,但它可以工作并且很干净。我也没有测试过速度,所以给他们两个试一试,看看什么最适合你。
    猜你喜欢
    • 2021-12-28
    • 2018-10-05
    • 2023-02-03
    • 2020-08-25
    • 1970-01-01
    • 2021-01-29
    • 2019-09-05
    • 2023-02-09
    • 2022-11-06
    相关资源
    最近更新 更多