【问题标题】:Expected behavior of Pandas str.isnumeric()Pandas str.isnumeric() 的预期行为
【发布时间】:2019-01-06 23:42:15
【问题描述】:

我有一个多类型系列 pd.Series[100, 50, 0, foo, bar, baz]

当我运行pd.Series.str.isnumeric()

我收到[NaN, NaN, NaN, False, False, False]

为什么会这样?本系列前三个不应该返回True吗?

【问题讨论】:

  • 运行 pd.Series.str.isnumeric() 应该会给你一个错误。

标签: python string pandas


【解决方案1】:

Pandas 字符串方法紧跟 Python 方法:

str.isnumeric(100)    # TypeError
str.isnumeric('100')  # True
str.isnumeric('a10')  # False

任何产生错误的类型都会给出NaN。根据 Python docsstr.isnumeric 仅适用于字符串:

str.isnumeric()
如果字符串中的所有字符都是数字字符,并且至少有一个字符,则返回true,false 否则。

根据 Pandas 的 docspd.Series.str.isnumeric 相当于 str.isnumeric

Series.str.isnumeric()
检查Series/Index 中每个字符串中的所有字符是否都是数字。相当于str.isnumeric()

您的系列有“object”dtype,这是一个包罗万象的类型,它包含指向任意 Python 对象的指针。这些可能是字符串、整数等的混合体。因此,您应该期待NaN 未找到字符串的值。

为了适应数字类型,您需要显式转换为字符串,例如给定一个系列s

s.astype(str).str.isnumeric()

【讨论】:

  • 好的。我认为这回答了它。所以我的 Series 是作为 Object dtype 读入的,但实际值是一些字符串和一些 int,所以 int 值被评估为 nan,因为它们不是字符串。
  • @Andrew,是的,确实如此,我用更详细的描述更新了我的答案。
【解决方案2】:

使用字符串访问器会将您的数字转换为NaN,它甚至在您尝试使用isnumeric 之前就发生了:

s = pd.Series([100, 50, 0, 'foo', 'bar', 'baz'])
s.str[:]

0    NaN
1    NaN
2    NaN
3    foo
4    bar
5    baz
dtype: object

因此,当您使用 isnumeric 时,NaN 仍然存在。请先使用 astype

s.astype(str).str.isnumeric()

0     True
1     True
2     True
3    False
4    False
5    False
dtype: bool

【讨论】:

  • 谢谢。这回答了我的问题,但@jpp 先回答了。
猜你喜欢
  • 2015-05-18
  • 1970-01-01
  • 2018-10-22
  • 2020-11-29
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
相关资源
最近更新 更多