#python #pandas
#python #pandas
Вопрос:
У меня есть этот код
data['A'].loc[data['A']>30] = 'high'
работает для меня. Однако, когда я использовал
data['A'].loc[data['A']<30] = 'low'
Появляется сообщение об ошибке
'<' not supported between instances of 'str' and 'int'
Я хотел иметь 'high'
значения для значений выше 30 и 'low'
для значений ниже 30 в одном и том же столбце pandas.
Комментарии:
1. можете ли вы поделиться своими фреймами данных?
2. Сравнения между различными типами данных больше не разрешены в Python 3. Похоже, это то, о чем говорит ваша ошибка. Может быть, вы могли бы добавить еще немного кода к своему вопросу?
3. Сначала вы устанавливаете, что половина ваших данных является строкой (т. Е.
'low'
), Затем сравниваете эти строки с числом 30. Эта операция не разрешена…4. [‘A’] содержит целые числа и число с плавающей запятой, но хотелось бы сгруппировать их в high и low для значений < и > 30. На самом деле это задание машинного обучения (классификации), над которым я работаю
5. Как просили люди, вы должны показать нам образец вашего фрейма данных / данных
Ответ №1:
Вместо ручного подхода используйте pd.cut
:
pd.cut(data['A'], [float('-inf'), 30, float('inf')], labels=['low', 'high'])
Пример:
s = pd.Series([-10, 40, 70, 60, 20])
pd.cut(s, [float('-inf'), 30, float('inf')], labels=['low', 'high'])
Вывод:
0 low
1 high
2 high
3 high
4 low
Ответ №2:
Когда вы писали эту строку:
data['A'].loc[data['A']>30] = 'high'
вы преобразовали свой A
столбец в столбец типа object
, содержащий int
и str
Когда вы пишете свою вторую строку
data['A'].loc[data['A']<30] = 'low'
pandas просматривает полный столбец (включая >30
столбцы, для которых были обновлены значения 'high'
)
лучшим подходом было бы использовать pd.cut
, как указано в gmds.
Вы также можете создать второй столбец, а затем удалить его в конце.
data['B'] = 'low'
data.loc[data.A>30, 'B'] = 'high'
data['A'] = data['B']
data.drop(columns=['B'], inplace=True)
Не самое элегантное решение, но оно работает