2013-08-25 50 views
20

Nói rằng tôi có một cột trong một dataframe rằng có một số con số và một số phi sốPandas: Chuyển đổi sang số, tạo Nans khi cần thiết

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

Làm thế nào tôi có thể chuyển đổi cột này để np.float, và có tất cả mọi thứ khác mà không phải là phao chuyển đổi nó sang NaN?

Khi tôi cố gắng:

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

hoặc

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

tôi nhận được ValueError: could not convert string to float: -

Trả lời

35

Trong gấu trúc 0.17.0convert_objects nâng cao một cảnh báo:

FutureWarning: convert_objects bị phản đối. Sử dụng loại dữ liệu chuyển đổi cụ thể pd.to_datetime, pd.to_timedelta và pd.to_numeric.

Bạn có thể sử dụng phương pháp pd.to_numeric và áp dụng nó cho dataframe với arg coerce.

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

hoặc có thể theo cách thích hợp hơn:

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

EDIT

Đó phương pháp duy nhất có giá trị cho gấu trúc phiên bản> = 0.17.0, từ docs what's new in pandas 0.17.0:

pd .to_numeric là một hàm mới để coerce strings thành số (pos Sibly với sự ép buộc) (GH11133)

+2

Ngón tay vượt qua điều này trở lại, đó là một viên đạn bạc tuyệt vời. –

+0

'mô-đun' đối tượng không có thuộc tính 'to_numeric'? – bgenchel

+0

hiển thị phiên bản đã chỉnh sửa, nó chỉ có sẵn từ phiên bản gấu trúc '0.17.0' –

7

Đầu tiên thay thế tất cả các giá trị chuỗi với None, để đánh dấu chúng là các giá trị bị mất tích và sau đó chuyển nó sang phao.

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

Cảm ơn! Tốt và đơn giản. –

+0

Đơn giản và hoạt động tốt hơn nhiều so với các đề xuất trước đó. –

+0

công việc doest này cho tôi ... bất kỳ ý tưởng nào? – ngakak

31

Sử dụng convert_objects Dòng phương pháp (và 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 

Lưu ý: đây cũng có sẵn như là một phương pháp DataFrame.

+1

"Cố gắng suy ra dtype tốt hơn cho các cột đối tượng" về cơ bản là một viên đạn ma thuật ... (và nó cũng có ngày quá.) –

+0

cảm ơn bạn !!! phương pháp này nên được trong mỗi hướng dẫn gấu trúc. – delgadom

+0

@ delgadom đáng ngạc nhiên không có phần "làm sạch" trong [10 phút hướng dẫn] (http://pandas.pydata.org/pandas-docs/stable/10min.html). Tôi cần phải hoàn thành quyển sách của mình :) –

1

Bạn chỉ có thể sử dụng pd.to_numeric và thiết lập lỗi để coerce mà không sử dụng apply

df['foo'] = pd.to_numeric(df['foo'], errors='coerce') 
Các vấn đề liên quan