Присвойте значение 1 положительным и 0 отрицательным числам в списке - PullRequest
0 голосов
/ 24 марта 2019

Я взял определенный список из большого набора данных и хотел бы присвоить значение 0 отрицательным числам и 1 - числам> = 0.

Этот код дал мне конкретный список из большего набора данных

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

Это код, который я уже пытался выполнить, что я хотел

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

Он не работал и вместо этого сказал, что "'> =' не поддерживается между экземплярами 'str' и 'int'"

Ответы [ 4 ]

1 голос
/ 24 марта 2019

Возможно, тип данных, который вы храните в «data», является строкой.Чтобы подтвердить это, вы можете сделать

print(type(num))

, если он печатает 'str', то вы сохраняете свои данные в переменной 'data' в виде строки.

Для этого есть 2 исправления: 1Вы можете просто хранить целые числа в данных.2. Если вы не можете ничего сделать с тем, как вы получаете данные, то вы можете привести их к целому числу и затем выполнить проверку.

Предполагая, что вы новый программист, для будущих ссылок, такого родаошибки называются ошибками типа или ошибками приведения.Это означает, что тип данных ваших операндов не совместим с оператором.В этом случае '> =' ожидает, что тип данных обоих его операндов 'num' и 0 будет одного и того же типа данных.

С другой стороны, похоже, что вы пытаетесь обновить элементывашего списка.Но то, как вы сейчас просматриваете список, вы не сможете обновить элементы.Если вы закончили печатать список в конце цикла for, вы заметите, что r не изменилась вообще.Вот хороший вопрос для работы со стеками Как изменить записи списка во время цикла for?

Чтобы исправить это, следуйте приведенному ниже примеру.

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'

Надеюсь, что это работаетиз!Ура!

0 голосов
/ 24 марта 2019

Столбец возврата может содержать числовые значения, как показано ниже:

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: '> =' не поддерживается между экземплярами 'str' и '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')
0 голосов
/ 24 марта 2019
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 </li>
0 голосов
/ 24 марта 2019

Вам необходимо преобразовать строку в целое число, например int ('2')

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

...