Проблема при преобразовании типа объекта в int

#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 в первую очередь помещает объект в столбец. Поскольку вы не показали нам этот код, мы можем только догадываться, что это такое.