2013-08-25 40 views
20

說我有一個數據幀的列中有一些數字和一些非數字熊貓:轉換爲數字,創造的NaN必要時

>> df['foo'] 
0  0.0 
1  103.8 
2  751.1 
3  0.0 
4  0.0 
5   - 
6   - 
7  0.0 
8   - 
9  0.0 
Name: foo, Length: 9, dtype: object 

我怎麼能這個列轉換爲np.float,並擁有一切那不是浮動將它轉換爲NaN

當我嘗試:

>> df['foo'].astype(np.float) 

>> df['foo'].apply(np.float) 

我得到ValueError: could not convert string to float: -

回答

35

在大熊貓0.17.0convert_objects提出一個警告:

FutureWarning:convert_objects已被棄用。使用數據類型 特定轉換器pd.to_datetime,pd.to_timedelta和pd.to_numeric。

您可以使用pd.to_numeric方法並將其應用於數據框,參數爲arg coerce

df1 = df.apply(pd.to_numeric, args=('coerce',)) 

,或者可以是更合適的方式:

df1 = df.apply(pd.to_numeric, errors='coerce') 

EDIT

該方法僅適用於大熊貓版本> = 0.17.0,從docs what's new in pandas 0.17.0

PD .to_numeric是一個將字符串強制轉換爲數字的新函數(pos sibly與強制)(GH11133)

+2

手指越過這回來,這是一個偉大的銀彈。 –

+0

'模塊'對象沒有屬性'to_numeric'? – bgenchel

+0

顯示編輯後的版本,只能從'0.17.0'熊貓版本 –

7

先用None替換所有的字符串值,將其標記爲缺失的值,然後將其轉換爲浮動。

df['foo'][df['foo'] == '-'] = None 
df['foo'] = df['foo'].astype(float) 
+0

謝謝!好,簡單。 –

+0

簡單,比以前的建議更好。 –

+0

這對我有用嗎...任何想法? – ngakak

31

使用convert_objects系列方法(和convert_numeric):

In [11]: s 
Out[11]: 
0 103.8 
1 751.1 
2  0.0 
3  0.0 
4  - 
5  - 
6  0.0 
7  - 
8  0.0 
dtype: object 

In [12]: s.convert_objects(convert_numeric=True) 
Out[12]: 
0 103.8 
1 751.1 
2  0.0 
3  0.0 
4  NaN 
5  NaN 
6  0.0 
7  NaN 
8  0.0 
dtype: float64 

注:這也可以作爲一個數據幀的方法。

+1

「嘗試推斷對象列的更好的dtype」基本上是一個神奇的子彈......(它的確也有日期。) –

+0

謝謝!!!這個方法應該在每個熊貓教程中。 – delgadom

+0

@delgadom令人驚訝的是[10分鐘教程]中沒有「清潔」部分(http://pandas.pydata.org/pandas-docs/stable/10min.html)。我需要完成我的書:) –

1

您可以簡單地使用pd.to_numeric並設置錯誤coerce不使用apply

df['foo'] = pd.to_numeric(df['foo'], errors='coerce')