【问题标题】:python pandas upper() not work for string columnspython pandas upper() 不适用于字符串列
【发布时间】:2016-05-22 02:03:33
【问题描述】:

您好,我正在处理 Kaggle Titanic 数据。我使用apply(lambda x: x.upper()) 处理多个列,但它不起作用。

我把数据放在我的谷歌驱动器上,你可以下载here

我在每一列上测试,都是object类型(我认为它的意思是str,如果有错误请纠正我)。但有些专栏报道'float' object has no attribute 'upper'

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

train = pd.read_csv('train.csv', header=0)

train.ix[:,['Name', 'Sex', 'Ticket', 'Cabin', 'Embarked']].dtypes
# Name        object
# Sex         object
# Ticket      object
# Cabin       object
# Embarked    object
# dtype: object

train.ix[:,['Name', 'Sex', 'Ticket', 'Cabin', 'Embarked']].apply(lambda x: x.upper()) 
# not work

# try each column
train.ix[:,'Name'].apply(lambda x: x.upper()) # works
train.ix[:,'Sex'].apply(lambda x: x.upper()) # works
train.ix[:,'Ticket'].apply(lambda x: x.upper()) # works
train.ix[:,'Cabin'].apply(lambda x: x.upper()) # AttributeError: 'float' object has no attribute 'upper'
train.ix[:,'Embarked'].apply(lambda x: x.upper()) # AttributeError: 'float' object has no attribute 'upper'

任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 我认为最好使用str.upper 方法。可能该错误是由于从object float 的类型转换与您的apply

标签: python pandas apply uppercase kaggle


【解决方案1】:

这是因为您的列 CabinEmbarked 包含具有 dtype np.floatNaN 值。你可以用你的申请类型来检查它:

In [355]: train.Cabin.apply(lambda x: type(x))[:10]
Out[355]:
0    <class 'float'>
1      <class 'str'>
2    <class 'float'>
3      <class 'str'>
4    <class 'float'>
5    <class 'float'>
6      <class 'str'>
7    <class 'float'>
8    <class 'float'>
9    <class 'float'>
Name: Cabin, dtype: object

所以你可以使用str.upper 默认处理NaN。 或者您可以使用具有upper 方法的fillnaNaN 值填充为空字符串'',然后使用您的`lambda 函数:

In [363]: train.Cabin.fillna('').apply(lambda x: x.upper)[:5]
Out[363]:
0
1     C85
2
3    C123
4
Name: Cabin, dtype: object

In [365]: train.Cabin.str.upper()[:5]
Out[365]:
0     NaN
1     C85
2     NaN
3    C123
4     NaN
Name: Cabin, dtype: object

或者,如果您想将 NaN 保存为 sting,您可以使用 NaN 字符串填充:

In [369]: train.Cabin.fillna('NaN').apply(lambda x: x.upper())[:5]
Out[369]:
0     NAN
1     C85
2     NAN
3    C123
4     NAN
Name: Cabin, dtype: object

【讨论】:

    【解决方案2】:

    这些列中存在缺失值。这些由 numpy.nan 表示,它是一个浮点数。如果您使用.str.upper() 而不是.apply(lambda x: x.upper()),则会识别这一事实并且不会产生错误。

    【讨论】:

    • 感谢@Anton Protopopov。有没有像numpy.str.nan 这样的东西?我可以强制它到object吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 2013-01-29
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多