【问题标题】:convert values in a series to either one of two values将系列中的值转换为两个值之一
【发布时间】:2020-05-10 23:53:55
【问题描述】:

我有一个 y 序列,其值介于 -3 和 3 之间。

我想将大于 0 的数字转换为 1,将小于或等于 0 的数字转换为 0。

最好的方法是什么?

我写了下面的代码。但是它并没有给我预期的输出。第一行有效。然而,在运行第二行之后,1 的值会变成随机的值,我不明白

import numpy as np
y_final = np.where(y > 0, 1, y).tolist()
y_final = np.where(y <= 0, 0, y).tolist()

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    如果值是整数,我认为您需要 Series.clip

    y = pd.Series(range(-3, 4))
    print (y)
    0   -3
    1   -2
    2   -1
    3    0
    4    1
    5    2
    6    3
    dtype: int64
    
    print (y.clip(lower=0, upper=1))
    0    0
    1    0
    2    0
    3    0
    4    1
    5    1
    6    1
    dtype: int64
    

    在您的解决方案中,可以通过设置 10 来简化它:

    y_final = np.where(y > 0, 1, 0)
    print (y_final)
    [0 0 0 0 1 1 1]
    

    或将0 等更大的掩码转换为整数:

    y_final = y.gt(0).astype(int)
    #alternative
    #y_final = (y > 0).astype(int)
    print (y_final)
    0    0
    1    0
    2    0
    3    0
    4    1
    5    1
    6    1
    dtype: int32
    

    【讨论】:

    • 我刚刚尝试了lower = 0 和upper = 1 的剪辑。它适用于大多数数字,但也有一些像0.93 这样的数字没有改变。我猜我的问题应该更准确。数字范围从 -3 到 3,但不仅仅是整数。欢呼
    • 你是对的,谢谢我只是需要把我的第二行改成 y_final,谢谢你的帮助
    【解决方案2】:

    你也可以使用简单的地图:

    numbers = range(-3,4)
    print(list(map(lambda n: 1 if n > 0 else 0, numbers)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-19
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2022-07-18
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多