将值 1 分配给正数,将 0 分配给列表中的负数

Assign value of 1 to positive and 0 to negative numbers in a list

我从一个更大的数据集中获取了一个特定的列表,我想将 0 的值分配给负数,将 1 的值分配给 >= 0 的数字。

此代码为我提供了更大数据集中的特定列表

r = data[['return']]
r.head()

这是我已经尝试完成我想要的代码

for num in r:
    if num >= 0:
        num = 1
    else:
        num = 0

它不起作用,而是说“'str' 和 'int' 的实例之间不支持‘>=’”

您需要将字符串转换为整数,如 int('2')

r = ['0','1','-1']
for num in r:
    number = int(num)
    if number >= 0:
        number = 1
    else:
        number = 0
    print(number)

r = pd.Series(['1', '2', '-1']) 
r = r.astype(float)

r[r>=0] = 1
r[r<0] = 0
# OR r = np.where(r>=0, 1, 0)
  • 转换为浮点数
  • 索引所有 >= 0 的值并将它们设置为 1
  • 索引所有 < 0 的值并将它们设置为 0

您在'data'中存储的数据类型可能是字符串。要确认这一点,您可以

print(type(num))

如果它打印 'str' 那么您将数据作为字符串存储在 'data' 变量中。

对此有 2 个修复: 1. 您可能只想在数据中存储整数。 2.如果你对获取数据的方式无能为力,那么你可以将你的数据转换为整数,然后进行检查。

假设您是新程序员,为了将来参考,这些类型的错误称为类型错误或转换错误。这意味着您的操作数的数据类型与运算符不兼容。在这种情况下,'>=' 期望其操作数 'num' 和 0 的数据类型是相同的数据类型。

附带说明一下,您似乎正在尝试更新列表中的成员。但是您现在循环遍历列表的方式,您将无法更新元素。如果您最终在 for 循环的末尾打印列表,您会注意到 r 根本没有改变。这里有一个很好的Whosebug问题供参考How to modify list entries during for loop?

要解决此问题,请按照以下示例操作。

for idx, num in enumerate(r):
    if int(num) >= 0:
        r[idx] = '1' # Note that you will be storing a string again
    else:
        r[idx] = '0'

希望一切顺利!干杯!

return 列可能包含数值,如下所示:

data_dict = {'return': [-1, 0, 2], 'col2': [10, 11, 12]}
data = pd.DataFrame(data)

r = data[['return']]
r.head()

for num in r:
    if num >= 0:
        num = 1
    else:
        num = 0

这给出了 TypeError: '>=' not supported between instances of 'str' and 'int',我认为这是因为 for 循环遍历列轴(这是字符串)。

我认为一个不错的解决方案是使用广播而不是 for 循环。但它在更改同一列时会发出警告:

r.loc[r['return'] >= 0,'return'] = 1
r.loc[r['return'] < 0,'return'] = 0

A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

因此您可以创建一个新列:

r.loc[r['return'] >= 0, 'return2'] = 1
r.loc[r['return'] < 0, 'return2'] = 0
r['return2'] = r['return2'].astype('int')