#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, либо любым другим значением по выбору.