Присвоение логического значения новому столбцу на основе условий - PullRequest
1 голос
/ 16 июня 2020

Мне нужно было бы присвоить логические значения строкам в новом столбце Y на основе значения столбца с именем X (1,2,3,4, 5). У меня есть этот столбец в наборе данных df:

X
1
1
1
3
2
5
2
4
1

Мне нужен новый, Y, в новом наборе данных, который является копией df, где:

  • если строка имеет значение X = 1, то True
  • если строка имеет значение X = 2, то False
  • если строка имеет значение X = 3, то False
  • если строка имеет X value = 4, затем True
  • если строка имеет значение X = 5, то False

Итак, у меня должно быть

X        Y
1      true
1      true
1      true
3      false
2      false
5      false
2      false
4      true
1      true

Я написал этот код:

new_df=df.copy()
new_df['Y'] = False
for index in df.iterrows():
    if   df['X'] == 1:
        new_df.iloc[index,9] = True
    elif df['X'] == 2:
        new_df.iloc[index,9] = False
    elif df['X'] == 3:
        new_df.iloc[index,9] = False
    elif df['X'] == 4:
        new_df.iloc[index,9] = True
    else:
        new_df.iloc[index,9] = False

появляется эта ошибка:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Не могли бы вы помочь мне исправить код, чтобы получить ожидаемый результат? Спасибо

1 Ответ

2 голосов
/ 16 июня 2020

Edit: np.where () предпочтительнее map ()

Я считаю, что вам нужно создать пользовательскую функцию, в которой вы можете использовать if-elif-else, а затем использовать map с Это. Что-то вроде:

def evaluator(x):
   if x == 1:
      return True
   elif x == 2:
      return False
   elif x == 3:
      return False
   elif x == 4: 
      return True
   else:
      return False
df['Y'] = df['X'].map(lambda x: evaluator(x))

@ Комментарий @ Allolz обеспечивает полезное упрощение, которое также может позволить использовать векторизованную операцию с np.where()

df['Y'] = np.where(df['X'].isin([1,4]),True,False) 

Это в вашем случае и учитывая ваш входной фрейм данных, выводит:

   X      Y
0  1   True
1  1   True
2  1   True
3  3  False
4  2  False
5  5  False
6  2  False
7  4   True
8  1   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...