2013-05-24 3 views
54

Cách bí mật cột DataFrame chứa chuỗi và NaN giá trị để nổi. Và có một cột khác có giá trị là chuỗi và phao; làm thế nào để chuyển đổi toàn bộ cột này để nổi.Chuyển đổi chuỗi để nổi trong DataFrame

+2

KHÔNG SỬ DỤNG ** 'conversion_objects' **. Nó không được chấp nhận. Hãy sử dụng 'to_numeric' hoặc' astype' thay vì –

Trả lời

28

Bạn có thể thử df.column_name = df.column_name.astype(float). Đối với các giá trị NaN, bạn cần chỉ định cách chúng được chuyển đổi, nhưng bạn có thể sử dụng phương thức .fillna để thực hiện.

Ví dụ:

In [12]: df 
Out[12]: 
    a b 
0 0.1 0.2 
1 NaN 0.3 
2 0.4 0.5 

In [13]: df.a.values 
Out[13]: array(['0.1', nan, '0.4'], dtype=object) 

In [14]: df.a = df.a.astype(float).fillna(0.0) 

In [15]: df 
Out[15]: 
    a b 
0 0.1 0.2 
1 0.0 0.3 
2 0.4 0.5 

In [16]: df.a.values 
Out[16]: array([ 0.1, 0. , 0.4]) 
47

này có sẵn trong 0.11. Buộc chuyển đổi (hoặc đặt thành nan) Điều này sẽ hoạt động ngay cả khi astype sẽ không thành công; nó cũng loạt bởi loạt vì vậy nó sẽ không chuyển đổi nói một cột chuỗi hoàn chỉnh

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo']))) 

In [11]: df 
Out[11]: 
    A B 
0 1.0 1.0 
1 1 foo 

In [12]: df.dtypes 
Out[12]: 
A object 
B object 
dtype: object 

In [13]: df.convert_objects(convert_numeric=True) 
Out[13]: 
    A B 
0 1 1 
1 1 NaN 

In [14]: df.convert_objects(convert_numeric=True).dtypes 
Out[14]: 
A float64 
B float64 
dtype: object 
+0

Xin lưu ý rằng điều này không hoạt động đối với các cột (tại multiindex leadt), chỉ hoạt động cho các giá trị trong khung dữ liệu – denfromufa

+1

Tôi đã phải sử dụng set_levels để chuyển đổi chuỗi thành float – denfromufa

+0

sau đó bạn đang làm điều gì sai . chuyển đổi chuỗi thành phao là hành động của người dùng bùng nổ. – Jeff

15
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
+2

Điều này không hoạt động khi chuyển đổi từ Chuỗi thành Float: 'ValueError: không thể chuyển đổi chuỗi thành float: 'date '' – Jack

27

Trong một phiên bản mới hơn của gấu trúc (0,17 trở lên), bạn có thể sử dụng chức năng to_numeric. Nó cho phép bạn chuyển đổi toàn bộ khung dữ liệu hoặc chỉ các cột riêng lẻ. Nó cũng cung cấp cho bạn khả năng chọn cách xử lý nội dung không thể chuyển đổi thành giá trị số:

import pandas as pd 
s = pd.Series(['1.0', '2', -3]) 
pd.to_numeric(s) 
s = pd.Series(['apple', '1.0', '2', -3]) 
pd.to_numeric(s, errors='ignore') 
pd.to_numeric(s, errors='coerce') 
+15

Để áp dụng' pd.to_numeric' vào 'DataFrame', người ta có thể sử dụng' df.apply (pd.to_numeric) 'như [được giải thích chi tiết trong câu trả lời này] (https://stackoverflow.com/a/34844867/604687). – Ninjakannon