2015-11-02 8 views
7

私は人が書いたカテゴリデータを持つPandas DataFrameを持っています。のは、このことを言ってみましょう:私はスペースを除去し、それらを大文字化することにより、これらの値を正規化したい文字列関数をNaNにできる要素に適用する

>>> df = pd.DataFrame({'name': ["A", " A", "A ", "b", "B"]}) 
    name 
0 A 
1 A 
2 A 
3 b 
4 B 

。これは素晴らしい作品:

>>> df.apply(lambda x: x['name'].upper().strip(), axis=1) 
0 A 
1 A 
2 A 
3 B 
4 B 

は私がいる問題は、私はまた、いくつかのnan値を有することである、と私は効果的にそれらは、この変換後nan sとままにしておきたいです。私はこれがある場合でも、私が好きな何

>>> df2 = pd.DataFrame({'name': ["A", " A", "A ", "b", "B", np.nan]}) 
>>> df2.apply(lambda x: x['name'].upper().strip(), axis=1) 
("'float' object has no attribute 'upper'", u'occurred at index 5') 

をこのです:

0 A 
1 A 
2 A 
3 B 
4 B 
5 NaN 

「なぜこれが起こっている私は(他の人が文字列である一方でナンは、フロートである)を理解し、私がすることができますトンこれを書いているエレガントな方法を見つける。..

任意の考え?

答えて

4

あなたはベクトル化strの演算子を使用することができます

>>> df2.name.str.strip().str.upper() 
0  A 
1  A 
2  A 
3  B 
4  B 
5 NaN 
Name: name, dtype: object 
+0

ブリリアント、おかげで多くのことを。これは、クリーンな方法である、と私は「ベクトル化文字列の方法」について知りませんでした:ここhttp://pandas.pydata.org/pandas-docs/stable/basics.html#vectorized-string-methods – user1496984

+0

また、より多くのドキュメント:http://pandas.pydata.org/pandas-docs/stable/text.html#text-string-methods – user1496984

0

あなたのラムダ関数内のif文が文字列であることを確認する必要が行うことができます:

>>> lambda x: x['name'].upper().strip() if isinstance(x, str) else x 
関連する問題