【问题标题】:mysterious Python Pandas lambda function error神秘的 Python Pandas lambda 函数错误
【发布时间】:2018-02-22 18:22:21
【问题描述】:

我有一个 pandas 数据框和一个名为“电子邮件”的列。我已经验证了 dtype 是对象。它包含正常格式的电子邮件,例如 xxx@yyy.com

当我这样做时:

$ df['emaillower'] = df['email'].apply(lambda x: x.lower())

我明白了:

Traceback (most recent call last):

File "<ipython-input-153-e951d53133eb>", line 1, in <module>
df['emaillower'] = df['email'].apply(lambda x: x.upper())

File "C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\series.py", 
line 
2355, in apply
mapped = lib.map_infer(values, f, convert=convert_dtype)

File "pandas\_libs\src\inference.pyx", line 1569, in 
pandas._libs.lib.map_infer (pandas\_libs\lib.c:66440)

File "<ipython-input-153-e951d53133eb>", line 1, in <lambda>
df['emaillower'] = df['email'].apply(lambda x: x.upper())

AttributeError: 'float' object has no attribute 'upper'      

发生了什么事?

【问题讨论】:

  • 您的“电子邮件”列是否只包含字符串??

标签: python pandas lambda


【解决方案1】:

“电子邮件”列中的一个条目是浮点数,而不是字符串,它不知道如何在浮点数上执行 upper()。当一个条目为空并转换为 NaN 时,这很常见 - 这被读取为浮点数,这就是您的错误的根源。这样的事情可能会解决问题:

df['emaillower'] = df['email'].apply(lambda x: x.upper() if type(x) is str else 'empty')

还需要注意的是,您将列 emaillower 称为“emaillower”,但实际上将其设为大写 ​​- 这可能会在未来引起一些混乱

【讨论】:

  • 这种情况很有趣,因为为数据帧加载生成输入文件的 SQL 指定了电子邮件 > ' ' 所以我所有的电子邮件值都被填充了......然而 Python 抱怨浮动。我刚刚做了 df['email'] = df['email'].astype(str)
  • 为清楚起见,我更正了原始问题,因此字段名称 emaillower 与 lower() 函数匹配
【解决方案2】:

建议使用 pandas 的 str 函数

df['emaillower'] = df['email'].astype(np.str).str.upper()

我使用 astye(np.str) 确保所有值都转换为字符串。

【讨论】:

  • 感谢这些 cmets 建议我输入:df['email'] = df['email'].astype(str) 并解决了问题。当我观察数据时,它的格式看起来很合适 xxxx@yyyy.com,但很明显,Python 在某个地方将某些东西解释为浮点数。
  • @MarkGinsburg,如果它能给你任何帮助,请考虑支持这个答案