2015-11-02 31 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秒。但是,如果我有這樣的:

>>> 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 

我明白爲什麼發生這種情況(NAN是一個浮動,而其他人都是字符串),但我可以」 t找到一個優雅的方式寫這個..

任何想法?

回答

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

你可以做的有一個,如果你的lambda函數聲明,以確保它是一個字符串:

>>> lambda x: x['name'].upper().strip() if isinstance(x, str) else x 
相關問題