我正在使用 Python/Pandas 进行一些数据发现。
MVCE:我有一个包含一些街道地址的 CSV 文件,我想找到文件中最长地址的长度。(这是我实际问题的简化版本)
我写了这个简单的Python代码:
import sys
import pandas as pd
df = pd.read_csv(sys.argv[1])
print(df['address'].map(len).max())
Run Code Online (Sandbox Code Playgroud)
地址列是 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()
Run Code Online (Sandbox Code Playgroud)
这是输出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
Run Code Online (Sandbox Code Playgroud)
更新
这是一个 CSV 文件示例
address,zip
555 APPLE STREET,82101
1180 BANANA LAKE ROAD,81913
577 LEMON DR,81911
,99999
Run Code Online (Sandbox Code Playgroud)
最后一行是重现问题的关键。
您的列中缺少数据,由 NaN(浮点类型)表示。
不要使用map/apply等来执行诸如查找长度之类的操作,只需使用以下命令即可str.len:
df['address'].str.len()
Run Code Online (Sandbox Code Playgroud)
不适用的项目会len()自动在结果中显示为 NaN。您可以fillna(-1)将这些指出来表明结果在那里无效。
我的解决方案是用空字符串填充Na,然后尝试运行应用程序,如下所示:
df['address'].fillna('', inplace=True)
print(df['address'].map(len).max())
Run Code Online (Sandbox Code Playgroud)