#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 /…