2015-11-02 21 views
7

olabilecek öğelere uygulama İnsanların yazdığı kategorik verileri içeren bir Pandas DataFrame ürünüm var. Şunu diyelim:Dize işlevlerini NaN

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

Bu değerleri boşlukları sıyırıp bunları genişleterek normalize etmek istiyorum.

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

sorunu yaşıyorum Ben de birkaç nan değerlere sahip olması ve ben etkili olanlar bu dönüşümden sonra nan s olarak kalmak istiyorum: Bu iyi çalışıyor. Bunu alabilir Ama eğer: '

Bu neden oluyor anlıyorum
0 A 
1 A 
2 A 
3 B 
4 B 
5 NaN 

(diğerleri dizeleri ise nan bir şamandıra vardır), ama elimden:

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

Ne istiyorum budur Bunu yazmanın zarif bir yolunu bul ..

Herhangi bir düşünce?

cevap

4

Sen vectorized str kullanabilirsiniz:

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

Parlak, çok teşekkürler. Bu en temiz yoldur ve 'vectorized string yöntemleri' hakkında bilgi vermedim: http://pandas.pydata.org/pandas-docs/stable/basics.html#vectorized-string-methods – user1496984

+0

Ayrıca burada daha fazla belge http://pandas.pydata.org/pandas-docs/stable/text.html#text-string-methods – user1496984

0

sahip yapabileceği bir lambda işlevinde deyimi bir dize sağlamak için ise:

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