Chuyển đổi chuỗi thành float trong DataFrame


112

Cách che một cột DataFrame chứa các chuỗi và NaNgiá trị để thả nổi. Và có một cột khác có giá trị là chuỗi và số float; làm thế nào để chuyển đổi toàn bộ cột này thành float.


7
KHÔNG ĐƯỢC SỬ DỤNG convert_objects. Nó không được dùng nữa. Sử dụng to_numerichoặc astypethay
Ted Petrou

Câu trả lời:


72

LƯU Ý: pd.convert_objects hiện đã không được dùng nữa. Bạn nên sử dụng pd.Series.astype(float)hoặc pd.to_numericnhư được mô tả trong các câu trả lời khác.

Điều 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 astypethất bại; nó cũng là chuỗi theo chuỗi 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

Hãy lưu ý rằng đây không phải làm việc cho các cột (tại leadt multiindex), hoạt động giống cho các giá trị trong dataframe
denfromufa

1
Tôi đã phải set_levels sử dụng để chuyển đổi chuỗi nổi
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Bạn có thể chuyển đổi chỉ một cột.
Jack

19
này bây giờ là pd.to_numeric (col) trong các phiên bản mới hơn
Jeff

11
convert_objects không được chấp nhận ở gấu trúc mới hơn. Sử dụng bộ chuyển đổi cụ thể kiểu dữ liệu pd.to_numeric.
Thomas Matthew

57

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

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

Trong phiên bản gấu trúc mới hơn (0,17 trở lên), bạn có thể sử dụng hàm 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ý những thứ 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')

32
Để áp dụng pd.to_numericcho a 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 .
Ninjakannon

31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
Đây không hoạt động khi chuyển đổi từ một String để một phao:ValueError: could not convert string to float: 'date'
Jack

@Jack bạn có biết cách giải quyết ở đây không? Tôi đang gặp phải vấn đề chính xác này khi chuyển đổi chuỗi thành float.
Hatt

@Hatt Tôi đang gặp phải vấn đề tương tự. bạn đã tìm thấy giải pháp cho nó?
Prakhar Jhudele

@Jack Tôi không chắc nhưng có vẻ như bạn đã kết hợp định dạng ngày tháng và số nổi. # chuyển đổi thành datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE

8

bạn phải thay thế chuỗi rỗng ('') bằng np.nan trước khi chuyển đổi thành float. I E:

df['a']=df.a.replace('',np.nan).astype(float)

1

Đây là một ví dụ

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

nhưng nếu đây là tất cả các giá trị chuỗi ... như trong trường hợp của tôi ... Chuyển đổi các cột mong muốn thành float:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Khung dữ liệu của bạn bây giờ sẽ có các giá trị float :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.