Добавить новый столбец по нескольким условиям

1

Я пытаюсь добавить новый столбец, category, существующим id категории.

conditions = [
    (result['id'] == 1362) or (result['id'] == 7463),
    (result['id'] == 543) or (result['id'] == 3424)]
choices = ['A1', 'A2']
result['category'] = np.select(conditions, choices, default='black')

Но у меня есть ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-289-7cb2bbdaab53> in <module>()
      1 conditions = [
----> 2     (result['id'] == 1362) or (result['id'] == 7463),
      3     (result['id'] == 543) or (result['id'] == 3424)]
      4 choices = ['A1', 'A2']
      5 result['category'] = np.select(conditions, choices, default='black')

/anaconda/lib/python3.6/site-packages/pandas/core/generic.py in __nonzero__(self)
    951         raise ValueError("The truth value of a {0} is ambiguous. "
    952                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 953                          .format(self.__class__.__name__))
    954 
    955     __bool__ = __nonzero__

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

Как я могу это исправить?

Теги:
pandas
python-3.x

1 ответ

0

С помощью pandas вам нужно использовать элементную логику или | или np.logical_or():

import numpy as np
import pandas as pd

d = {"id": [1362, 1361, 7463, 7462, 543, 542, 3424, 3333]}
result = pd.DataFrame(d)

conditions = [np.logical_or(result['id'] == 7463, result['id'] == 1362),
              np.logical_or(result['id'] == 3424, result['id'] == 543)]

#Alternate syntax
#conditions = [(result['id'] == 7463) | (result['id'] == 1362),
#              (result['id'] == 3424) | (result['id'] == 543)]

choices = ['A1', 'A2']
result['category'] = np.select(conditions, choices, default='black')

print(result)

     id category
0  1362       A1
1  1361    black
2  7463       A1
3  7462    black
4   543       A2
5   542    black
6  3424       A2
7  3333    black
  • 0
    Спасибо за ответ. Но если я добавлю еще одно условие (например, result ['id'] == 1362, result ['id'] == 7463, result ['id'] == 1361), оно не будет работать. Это "np.logical_or" кажется только для сравнения двух значений, если я правильно понимаю ... Что мне делать, если у меня более двух условных значений?
  • 0
    @chu Вы можете вложить их, например, np.logical_or(result['id'] == 7463, np.logical_or(result['id'] == 1361, result['id'] == 1362))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню