首页 > 解决方案 > 对 pandas data.frame 的列应用函数会产生错误

问题描述

假设我在 pandas data.frame 下面 -

>>> Data
          Col1  Col2
53   08.02.2020 2020-02-14
55   01.02.2020 2020-02-13
335  30.01.2020 2020-02-14
365  14.02.2020 2020-02-16
446  11.02.2020 2020-02-15
476  03.02.2020 2020-02-18
504  08.02.2020 2020-02-10
557  01.02.2020 2020-02-15
668  10.02.2020 2020-02-15
756  07.02.2020 2020-02-08

接下来,我有以下功能 -

is_ten_char = lambda x: x.str.len().eq(10)

但是,将此函数应用于列以检查字符数会产生错误 -

Data[is_ten_char(Data.Col1) & is_ten_char(Data.Col2)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/generic.py", line 5270, in __getattr__
    return object.__getattribute__(self, name)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/accessor.py", line 187, in __get__
    accessor_obj = self._accessor(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/strings.py", line 2041, in __init__
    self._inferred_dtype = self._validate(data)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/strings.py", line 2098, in _validate
    raise AttributeError("Can only use .str accessor with string values!")
AttributeError: Can only use .str accessor with string values!

任何出现问题的指针都会非常有帮助。

标签: python-3.xpandas

解决方案


  • Col1显然不是如图所示的日期时间格式
  • Col2可能是日期时间格式,因此要将其作为字符串进行比较,请执行以下操作
is_ten_char = lambda x: x.str.len().eq(10)
Data[is_ten_char(Data.Col1) & is_ten_char(Data.Col2.dt.strftime('%Y-%m-%d'))]
  • 但是,这不会转换Col2为字符串
    • print(Data['Col2'][53])>>>Timestamp('2020-02-14 00:00:00')
  • 如果要Col2转换为字符串
    • Data.Col2 = Data.Col2.dt.strftime('%y-%m-%d')
    • 然后使用原代码

推荐阅读