【问题标题】:Pandas TypeError: object of type 'float' has no len()Pandas TypeError:“float”类型的对象没有 len()
【发布时间】:2021-10-20 03:10:27
【问题描述】:

我正在使用 Python/Pandas 进行一些数据发现。

MVCE:我有一个包含一些街道地址的 CSV 文件,我想查找文件中最长地址的长度。 (这是我实际问题的简化版)

我编写了这个简单的 Python 代码:

import sys
import pandas as pd

df = pd.read_csv(sys.argv[1])

print(df['address'].map(len).max())

地址列的类型是 str,或者我认为是这样的(见下文)。

为什么会出现这个错误?

Traceback (most recent call last):
  File "eval-lengths.py", line 8, in <module>
    print(df['address'].map(len).max())
  File "C:\Python35\lib\site-packages\pandas\core\series.py", line 2996, in map
    arg, na_action=na_action)
  File "C:\Python35\lib\site-packages\pandas\core\base.py", line 1004, in _map_values
    new_values = map_f(values, mapper)
  File "pandas/_libs/src\inference.pyx", line 1472, in pandas._libs.lib.map_infer
TypeError: object of type 'float' has no len()

这是df.info()的输出

RangeIndex: 154733 entries, 0 to 154732
Data columns (total 2 columns):
address    154510 non-null object
zip        154732 non-null object
dtypes: object(2)
memory usage: 2.4+ MB

更新

这是一个示例 CSV 文件

address,zip
555 APPLE STREET,82101
1180 BANANA LAKE ROAD,81913
577 LEMON DR,81911
,99999

最后一行是重现问题的关键。

【问题讨论】:

  • 您能否在缩短的 csv 文件上重现该错误并提供 csv 文件?没有它很难调试。另外,也许提供df.dtypesdf['address'][:5] 的输出,以便我们看到。

标签: python pandas


【解决方案1】:

您的列中缺少数据,由 NaN(浮点类型)表示。

不要将map/apply 等用于查找长度等操作,只需使用str.len 即可:

df['address'].str.len()

len() 不适用的项目在结果中自动显示为 NaN。你可以fillna(-1)那些出来表明结果无效。

【讨论】:

  • 你是对的,空字符串(“”)显然被转换为浮点数。对于从其他编程语言进入 Python 的人来说,这是完全违反直觉的。在大多数其他语言中,空字符串仍然是字符串。将map(len) 更改为str.len() 可以解决问题。
【解决方案2】:

我的解决方案是用空字符串填充Na,然后尝试运行应用程序,如下所示:

df['address'].fillna('', inplace=True)
print(df['address'].map(len).max())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多