【问题标题】:Issue while converting object type to int将对象类型转换为 int 时出现问题
【发布时间】:2021-01-27 01:55:09
【问题描述】:

我有一个冗长的 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'

以前有没有人遇到过这个错误??请帮忙。

【问题讨论】:

  • 尝试运行type(df['b'])。它是一个整数吗?听起来你把它当作一种方法。
  • 那一栏有什么内容?听起来之前的操作不正确。
  • 我想这是错误的。类型将是熊猫系列。你必须这样做:df['b'].dtype
  • Df['b'] 是对象数据类型

标签: python dataframe object type-conversion integer


【解决方案1】:

您收到该错误是因为该列中至少有一个 python method 对象。很可能整个专栏都充满了一种方法。现在我不得不推测一下,因为你没有给我们足够的信息,但是如果你误用了 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()

【讨论】:

  • 嗨@tdelaney:感谢您的快速回复。我已经创建了集群并上传了与该列中的集群相对应的最小值和最大值。当您要求添加 ()... 我想问我是否应该在转换语句中添加 () 像 .astype(int())...。 0' 作为数据类型。我将 0 作为列中的值之一
  • 错误发生在astype 调用之前。 astype 在列中找到方法对象,您必须弄清楚它们是如何到达那里的。可以肯定的是,在您向我们展示的内容之前您对该专栏所做的事情就是问题所在。在我的示例中,它将是 df['a'] = df['a'].abs()
  • 不幸的是,它再次给出错误:abs() 的操作数类型错误:方法 ()
  • 我只是以abs 为例。由于我没有您的代码,我无法真正猜测它是哪个功能。在任何情况下,如果您将括号添加到您正在使用的任何函数中,然后出现此错误,那仅意味着您发现了另一个错误。你必须弄清楚为什么那个函数会失败。
  • 但是让我们明确一点,我并不是建议你这样做df['a'] = df['a'].abs().astype('int')。我建议您首先查看将method 对象放在列中的这些行的代码above。由于您没有向我们展示该代码,我们只能推测它是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2020-07-10
  • 1970-01-01
相关资源
最近更新 更多