2

こんにちは、Kaggle Titanic のデータを扱っています。以前は複数の列で作業していましたが、うまくいきapply(lambda x: x.upper())ません。

データは Google ドライブに保存しました。ここからダウンロードできます。

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'

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

5

これは、列Cabinにdtype を持つ値がEmbarked含まれているためです。適用のキャストタイプで確認できます:NaNnp.float

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したがって、デフォルトで which ハンドルを使用できNaNます。または、hasメソッドを使用してNaN値を空の文字列に入力し、`lambda 関数を使用することもできます。''fillnaupper

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で埋めることができ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
于 2016-02-11T10:57:14.760 に答える
1

これらの列には欠損値があります。numpy.nanこれらはfloat で表されます。.str.upper()の代わりにを使用すると.apply(lambda x: x.upper())、この事実が認識され、エラーが発生しなくなります。

于 2016-02-11T10:41:00.503 に答える