Создайте новый столбец в pandas в зависимости от нескольких условий

#pandas #loops

#pandas #циклы

Вопрос:

Я хотел бы создать новый столбец на основе различных условий

Допустим, у меня есть df, где столбец A может быть равен любому из следующих значений: [‘Single’, ‘Multiple’, ‘Commercial’, ‘Domestic’, ‘Other’], столбец B имеет числовые значения от 0 до 30.

Я пытаюсь сделать столбец C «умеренным», если A = «Одиночный» или «Множественный», и если он равен чему-либо еще, чтобы учитывать значения в столбце B. Если столбец A != ‘Single’ или ‘Multiple’, столбец C будет равен умеренному, если 3 < B > 19 и ‘High’, если B>=19.

Я пробовал различные комбинации циклов, но, похоже, у меня ничего не получается. Любая помощь?

 trial = []
for x in df['A']: 
    if x == 'Single' or x == 'Multiple':
        trial.append('Moderate') 
    elif x != 'Single' or x != 'Multiple':
        if df['B']>19:
                trial.append('Test') 


df['trials'] = trial
  

Большое спасибо,

Денисс

Комментарии:

1. Пожалуйста, предоставьте образцы данных.

Ответ №1:

Будет хорошо, если вы предоставите некоторые образцы данных. Но с некоторыми, которые я создал, вы можете увидеть, как применить функцию к каждой строке вашего фрейма данных.

Данные

 valuesA = ['Single', 'Multiple', 'Commercial', 'Domestic', 'Other',
           'Single', 'Multiple', 'Commercial', 'Domestic', 'Other']
valuesB = [0, 10, 20, 25, 30, 25, 15, 10, 5, 3 ]

df  = pd.DataFrame({'A': valuesA, 'B': valuesB})
  
 |    | A          |   B |
|---:|:-----------|----:|
|  0 | Single     |   0 |
|  1 | Multiple   |  10 |
|  2 | Commercial |  20 |
|  3 | Domestic   |  25 |
|  4 | Other      |  30 |
|  5 | Single     |  25 |
|  6 | Multiple   |  15 |
|  7 | Commercial |  10 |
|  8 | Domestic   |   5 |
|  9 | Other      |   3 |
  

Функция для применения

Вы не указываете, что произойдет, если столбец B меньше или равен 3, поэтому я полагаю, что C будет «низким». Адаптируйте функцию так, как вам нужно. Кроме того, возможно, в вашем вопросе есть опечатка, где вы говорите ‘3 < B > 19’, я изменил на ‘3 < B < 19’.

 def my_function(x):
    if x['A'] in ['Single', 'Multiple']:
        return 'Moderate'
    else:
        if x['B'] <= 3:
            return 'Low'
        elif 3 < x['B'] < 19:
            return 'Moderate'
        else:
            return 'High'

  

Новый столбец

С помощью фрейма данных и новой функции вы можете применить его к каждой строке с помощью метода apply, используя аргумент ‘axis = 1’:

 df['C'] = df.apply(my_function, axis=1)
  
 |    | A          |   B | C        |
|---:|:-----------|----:|:---------|
|  0 | Single     |   0 | Moderate |
|  1 | Multiple   |  10 | Moderate |
|  2 | Commercial |  20 | High     |
|  3 | Domestic   |  25 | High     |
|  4 | Other      |  30 | High     |
|  5 | Single     |  25 | Moderate |
|  6 | Multiple   |  15 | Moderate |
|  7 | Commercial |  10 | Moderate |
|  8 | Domestic   |   5 | Moderate |
|  9 | Other      |   3 | Low      |
  

Комментарии:

1. Привет, Аугусто, спасибо за этот подробный ответ. Я попробовал функцию, введя свой df в качестве значения x, и я получил эту ошибку: значение истинности ряда неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all(). Знаете ли вы, что я сделал не так?

2. Аргумент x это не фрейм данных, это фрейм данных строки. Это причина, по которой вы должны отправить функцию через метод apply() из фрейма данных. pandas.pydata.org/pandas-docs/stable/reference/api /…