python pandas upper() 不适用于字符串列
python pandas upper() not work for string columns
您好,我正在处理 Kaggle Titanic 数据。我使用 apply(lambda x: x.upper())
来处理多列,但它不起作用。
我把数据放在我的 google 驱动器上,你可以下载 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'
感谢您的帮助。谢谢!
这些列中存在缺失值。这些由 numpy.nan
表示,它是一个浮点数。如果您使用 .str.upper()
而不是 .apply(lambda x: x.upper())
,那将识别这一事实并且不会产生错误。
这是因为您的列 Cabin
和 Embarked
包含数据类型为 np.float
的 NaN
值。你可以用你申请的铸造类型来检查它:
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
方法的 fillna
将 NaN
值填充为空字符串 ''
,然后使用您的 `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
您好,我正在处理 Kaggle Titanic 数据。我使用 apply(lambda x: x.upper())
来处理多列,但它不起作用。
我把数据放在我的 google 驱动器上,你可以下载 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'
感谢您的帮助。谢谢!
这些列中存在缺失值。这些由 numpy.nan
表示,它是一个浮点数。如果您使用 .str.upper()
而不是 .apply(lambda x: x.upper())
,那将识别这一事实并且不会产生错误。
这是因为您的列 Cabin
和 Embarked
包含数据类型为 np.float
的 NaN
值。你可以用你申请的铸造类型来检查它:
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
方法的 fillna
将 NaN
值填充为空字符串 ''
,然后使用您的 `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