【问题标题】:assign three values based on condition to pandas df column根据条件为 pandas df 列分配三个值
【发布时间】:2019-08-03 03:49:31
【问题描述】:

我有一个 pandas df,其中包含一列正数、负数和零。我想创建另一列,如果 no > 0,则为 1,如果 no

我正在尝试对每一行使用 for 循环来执行此操作,但它花费的时间太长。我想知道是否有更快的方法来做到这一点。我还想知道是否可以将相同的逻辑扩展到正负 timedelta 对象。
谢谢。

我的最终 df 应该是这样的:

df = pd.DataFrame({'a':[1, 2, -1, 0, -2], 'b':[1, 1, -1, 0, -1]})

     a   b
0    1   1
1    2   1
2   -1  -1
3    0   0
4   -2  -1

其中 b 是根据 a 的值分配的 col

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种方法numpysign

    np.sign(df.a)
    Out[118]: 
    0    1
    1    1
    2   -1
    3    0
    4   -1
    Name: a, dtype: int64
    df['b'] = np.sign(df.a)
    

    【讨论】:

    • 谢谢。有没有办法对 timedelta 对象执行此操作。我试过了,还是不行
    • @Moshee np.sign( (df.a / np.timedelta64(1, 'D')).astype(int))
    【解决方案2】:

    尝试使用 np.where 并提供条件

    import numpy as np
    
    df['b']= np.where(df['a']>0,1,
             np.where(df['a']<0,-1,0))
    
         a   b
    0    1   1
    1    2   1
    2   -1  -1
    3    0   0
    4   -2  -1
    

    @rafaelc 的解决方案

    m1= df['a'] >0
    m2= df['a'] <0
    
    
    df['b'] = np.select([m1, m2],
                        [ 1, -1], 
                        default=0)
    

    【讨论】:

    • 对于多个条件,首选np.select而不是嵌套np.where
    • 让我稍微修改一下
    • @rafaelc 感谢您的建议。我已添加 np.select
    • @WeNYoBen 谢谢我实际上不使用 np.select 更多所以这就是为什么我不熟悉default
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2018-04-30
    • 2020-06-09
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多