#python #dataframe #object #type-conversion #integer
#python #фрейм данных #объект #преобразование типа #целое число
Вопрос:
У меня есть длинный код на python, в котором я менял типы данных нескольких столбцов с object на int или float, используя метод ниже
df['a'] = df['a'].astype('int')
df['b'] = df['b'].astype('int')
Однако после этого преобразования я получил ошибку ниже
int() argument must be a string, a bytes-like object or a number, not 'method'
Кто-нибудь сталкивался с этой ошибкой раньше?? Пожалуйста, помогите.
Комментарии:
1. Попробуйте запустить
type(df['b'])
. Это Int? Похоже, вы оставили это как метод.2. Что в этом столбце? Похоже, предыдущая операция была неправильной.
3. Я думаю, это неправильно, кстати. Тип будет серией pandas. Вместо этого вам нужно будет сделать:
df['b'].dtype
.4. Df[‘b’] — это тип данных объекта
Ответ №1:
Вы получили эту ошибку, потому что в этом столбце есть хотя бы один method
объект python. Вероятно, весь столбец заполнен методом. Теперь я должен размышлять, потому что вы не предоставили нам достаточно информации, но это легко сделать случайно, если вы неправильно используете a ufunc
, пренебрегая его вызовом.
>>> df = pd.DataFrame([[1],[-2],[3]], columns=['a'])
>>> df['a'] = df['a'].abs # BUG: Fills column with `method` object
>>> df['a'] = df['a'].astype('int')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/pandas/core/generic.py", line 5881, in astype
new_data = self._data.astype(
File "/usr/lib/python3/dist-packages/pandas/core/internals/managers.py", line 581, in astype
return self.apply("astype", dtype=dtype, **kwargs)
File "/usr/lib/python3/dist-packages/pandas/core/internals/managers.py", line 438, in apply
applied = getattr(b, f)(**kwargs)
File "/usr/lib/python3/dist-packages/pandas/core/internals/blocks.py", line 559, in astype
return self._astype(dtype, copy=copy, errors=errors, values=values, **kwargs)
File "/usr/lib/python3/dist-packages/pandas/core/internals/blocks.py", line 643, in _astype
values = astype_nansafe(vals1d, dtype, copy=True, **kwargs)
File "/usr/lib/python3/dist-packages/pandas/core/dtypes/cast.py", line 711, in astype_nansafe
return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
File "pandas/_libs/lib.pyx", line 547, in pandas._libs.lib.astype_intsafe
TypeError: int() argument must be a string, a bytes-like object or a number, not 'method'
Вам нужно посмотреть на последнее, что вы сделали с этим столбцом, и посмотреть, случайно ли он заполнил столбец объектом метода. Если это так, добавьте эти ковбойские ноги ()
.
df['a'] = df['a'].abs()
Комментарии:
1. Привет @tdelaney: Спасибо за быстрый ответ. Я создал кластеры и загрузил минимальное и максимальное значение, соответствующее кластеру в этом столбце. Как вы просили добавить ()… Я хотел бы спросить, должен ли я добавить () в состояние преобразования, например .astype(int())…. Если это так, то я снова столкнулся с ошибкой, которая не может интерпретировать ‘0’ как тип данных. У меня 0 в качестве одного из значений в столбце
2. Ошибка произошла перед
astype
вызовом.astype
найдены объекты метода в столбце, и вам нужно выяснить, как они туда попали. Можно поспорить, что проблема в том, что вы сделали с этим столбцом непосредственно перед тем, что вы нам показываете. В моем примере это было быdf['a'] = df['a'].abs()
3. К сожалению, он снова выдает ошибку: неверный тип операнда для abs (): метод ()
4. Я просто использовал
abs
в качестве примера. Поскольку у меня нет вашего кода, я не могу догадаться, какая это функция. В любом случае, если вы добавили скобки к любой используемой вами функции, а затем получили эту ошибку, это просто означает, что вы обнаружили еще одну ошибку. Вы должны выяснить, почему эта функция не работает.5. Но давайте проясним, я не предлагаю вам это делать
df['a'] = df['a'].abs().astype('int')
. Я предлагаю вам взглянуть на код над этими строками, которыйmethod
в первую очередь помещает объект в столбец. Поскольку вы не показали нам этот код, мы можем только догадываться, что это такое.