Не поддерживается между экземплярами str и int

#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)
  

Не самое элегантное решение, но оно работает