神秘的Python Pandas lambda函数错误

时间:2018-02-22 18:22:21

标签: python pandas lambda

我有一个pandas数据框,我有一个名为'email'的列。我已经验证了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'      

发生了什么事?

2 个答案:

答案 0 :(得分:2)

“email”列中的一个条目是float,而不是字符串,并且它不知道如何在float上执行upper()。当一个条目为空并转换为NaN时,这是常见的 - 这被读作浮点数,这是错误的来源。这样的事情可以解决问题:

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

另请注意,您调用了电子邮件列,但实际上是将其设为大写 ​​- 这可能会在将来引起一些混淆

答案 1 :(得分:1)

建议使用pandas中的str函数

Button plus5b = (Button)findViewById(R.id.button);
plus5b.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        for (int i = 1; i <= 5; i++) {
            counterValue++;
        }
        counterdown.setText(String.valueOf(counterValue));
        plussound.start();
    }
});

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