Поиск уникальных элементов столбца. Ошибка типа: ‘<' не поддерживается между экземплярами 'float' и 'str'

#python #numpy

#python #numpy

Вопрос:

«12» — это имя столбца.В синтаксисе предполагается, что это массив. Как мне преобразовать ’12’ в единицу в данном сценарии.

 print(np.unique(data_csv['12']))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-61-ff7ee2ed6695> in <module>
      1 import numpy as np
----> 2 print(np.unique(data_csv['12']))

<__array_function__ internals> in unique(*args, **kwargs)

~anaconda3libsite-packagesnumpylibarraysetops.py in unique(ar, return_index, return_inverse, return_counts, axis)
    261     ar = np.asanyarray(ar)
    262     if axis is None:
--> 263         ret = _unique1d(ar, return_index, return_inverse, return_counts)
    264         return _unpack_tuple(ret)
    265 

~anaconda3libsite-packagesnumpylibarraysetops.py in _unique1d(ar, return_index, return_inverse, return_counts)
    309         aux = ar[perm]
    310     else:
--> 311         ar.sort()
    312         aux = ar
    313     mask = np.empty(aux.shape, dtype=np.bool_)

TypeError: '<' not supported between instances of 'float' and 'str'
  

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

1. кажется, в вашем столбце есть несоответствующие типы, какой тип data_csv['12'] ? если это столбец фрейма данных pandas, выполните np.unique(data_csv['12'].astype(float))

2. dtype столбца ’12’ является object .

3. Пожалуйста, предоставьте нам более подробную информацию и минимальный воспроизводимый пример. В частности, что находится внутри data_csv['12'] ?

Ответ №1:

Возможная причина вашей ошибки заключается в том, что:

  • Вы прочитали data_csv из текстового файла, вызвав, например, pd.read.csv,
  • Большинство значений в столбце ’12’ в исходном файле содержат строки, преобразуемые в числа (например, float).
  • Но по крайней мере одна ячейка содержит неконвертируемую строку.
  • Таким образом, тип этого столбца после чтения — object .

Пример исходного содержимого:

 Name,12
a,3.0
b,4.1
c,2.0
a,3.0
b,1.0
c,2xx
  

Пока что каждый элемент в столбце ’12’ представляет собой строку, и когда вы запускаете:

 np.unique(data_csv['12'])
  

вы получаете правильный результат:

 array(['1.0', '2.0', '2xx', '3.0', '4.1'], dtype=object)
  

Теперь, чтобы воссоздать вашу ошибку, присвойте значение с плавающей запятой любой ячейке в
этом столбце, например:

 data_csv.iloc[0,1] = 3.0
  

Печатное содержимое вашего фрейма данных выглядит точно так же, но при
попытке запуска np.unique(data_csv['12']) вы получите
исключение TypeError.

Причина в том, что Numpy был написан для работы со столбцами (или массивами) одного типа (например, string или float), но не для их смешивания.

Одним из возможных решений является запуск реализации pandasonic этой функции:

 pd.unique(data_csv['12'])
  

который возвращает:

 array([3.0, '4.1', '2.0', '3.0', '1.0', '2xx'], dtype=object)
  

Обратите внимание, что результат содержит как float 3.0, так и string 3.0,
поскольку они имеют разные типы.

Один из комментариев к вашему сообщению предлагает выполнить np.unique(data_csv['12'].astype(float)) . Я попробовал и получил ту же ошибку. Неудивительно. Поскольку одна из ячеек содержит неконвертируемую строку, этот метод фактически ничего не меняет.

Но если вы преобразуете каждый элемент в строку, а затем попытаетесь получить уникальные значения:

 np.unique(data_csv['12'].astype(str))
  

Результат:

 array(['1.0', '2.0', '2xx', '3.0', '4.1'], dtype=object)
  

Приведенный выше код не вызвал исключения, потому что любой float преобразуется в string .

Рассмотрите также другое решение: интересующий вас столбец, вероятно, должен содержать только float s, и вам следует скорее:

  • найти элементы, не конвертируемые в float,
  • замените их либо NaN, либо любым другим значением по выбору.