代码之家  ›  专栏  ›  技术社区  ›  Fran Martinez

根据Pandas上的列值应用lambda

  •  2
  • Fran Martinez  · 技术社区  · 9 年前

    Order 我想取列的值 Value

    数据框架1

                 Order  Shares   Value
    2011-01-10   BUY    1300     340.99  
    2011-01-10   SELL   1200     340.99
    2011-01-11   SELL   1100     330.99   
    

    代码行:

    impacts['NewValue']=float(impacts.Order.apply(lambda x: (impacts.Value + (impacts.Value * 0.006)) if x == 'SELL' else (impacts.Value - (impacts.Value * 0.006))))
    

    错误:

    TypeError:ufunc“multiply”不包含具有签名匹配类型dtype('S32')dtype('S32')dtype('S32')的循环

    我的理解是,错误是由数字的内容引起的,因此我试图将其转换为浮点。

                Order  Shares   Value   NewValue
    2011-01-10   BUY    1300   340.99  338.94
    2011-01-10   SELL   1200   340.99  343.03
    2011-01-11   SELL   1100   330.99  332.97
    

    任何帮助都是受欢迎的。谢谢

    2 回复  |  直到 9 年前
        1
  •  2
  •   BENY    9 年前

    希望对您有所帮助:-)(仅修改了您自己的代码,您的示例代码将返回错误)

    df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1)
    Out[790]: 
    2011-01-10    338.94406
    2011-01-10    343.03594
    2011-01-11    332.97594
    dtype: float64
    

    得到 df

    df['NewValue']=df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1)
    df
    Out[792]: 
               Order  Shares   Value   NewValue
    2011-01-10   BUY    1300  340.99  338.94406
    2011-01-10  SELL    1200  340.99  343.03594
    2011-01-11  SELL    1100  330.99  332.97594
    

    我将使用 np.where

    import numpy as np
    np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006)) )
    Out[794]: array([ 338.94406,  343.03594,  332.97594])
    

    df['NewValue']=np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006)) )
    df
    Out[796]: 
               Order  Shares   Value   NewValue
    2011-01-10   BUY    1300  340.99  338.94406
    2011-01-10  SELL    1200  340.99  343.03594
    2011-01-11  SELL    1100  330.99  332.97594
    
        2
  •  2
  •   cs95 abhishek58g    9 年前

    (篇幅太长,不宜评论)这是温讲话的一个略为精简的版本 np.where

    i = np.where(df.Order == 'SELL', 1, -1) * 0.006
    df.Value = df.Value.mul(i) + df.Value
    
    print(df.Value)
    2011-01-10    338.94406
    2011-01-10    343.03594
    2011-01-11    332.97594
    dtype: float64
    

    df.Order 在手术前确定标志。