Chuyển đổi chuỗi số với dấu phẩy trong gấu trúc DataFrame thành float


89

Tôi có DataFrame chứa các số dưới dạng chuỗi với dấu phẩy cho điểm đánh dấu hàng nghìn. Tôi cần chuyển đổi chúng thành phao.

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

Tôi đoán mình cần sử dụng locale.atof. Thật

df[0].apply(locale.atof)

hoạt động như mong đợi. Tôi nhận được một loạt phao.

Nhưng khi tôi áp dụng nó vào DataFrame, tôi gặp lỗi.

df.apply(locale.atof)

TypeError: ("không thể chuyển đổi chuỗi thành", không xuất hiện ở chỉ mục 0 ')

df[0:1].apply(locale.atof)

đưa ra một lỗi khác:

ValueError: ('ký tự không hợp lệ cho float (): 1.200', không xuất hiện ở chỉ mục 0 ')

Vì vậy, làm cách nào để chuyển đổi DataFramechuỗi này thành DataFrame của float?


2
Câu hỏi cũ, nhưng OP đang nhận được lỗi đó vì applytrên DataFrame chuyển toàn bộ cột cho hàm dưới dạng một chuỗi (trong trường hợp locale.atofnày là một chuỗi). Nếu bạn sử dụng applymapphương pháp mà @AndyHayden thực hiện trong câu trả lời bên dưới, bạn sẽ có thể thực hiện điều này tốt.
TC Proctor

Câu trả lời:


145

Nếu bạn đang đọc từ csv thì bạn có thể sử dụng hàng nghìn đối số :

df.read_csv('foo.tsv', sep='\t', thousands=',')

Phương pháp này có thể hiệu quả hơn so với thực hiện thao tác như một bước riêng biệt.


Trước tiên, bạn cần đặt ngôn ngữ :

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

Tôi nên nói rằng tôi đã thiết lập ngôn ngữ. Tôi vẫn nhận được lỗi.
pheon

2
Nhưng tôi đang sử dụng df.read_fwf và điều đó cũng có tùy chọn "nghìn = ','" hoạt động. Cảm ơn.
pheon

Sau đó, một lần nữa, tại sao df.applymap (atof) hoạt động cho bạn mà không phải cho tôi? Ngôn ngữ của tôi là 'en_US.UTF-8'.
pheon

10
Tôi đã bình chọn điều này cho mẹo đối số 'hàng nghìn' cho hàm read_csv. Điều đó làm việc tuyệt vời cho tôi.
rockfakie

3
Tôi muốn nói thêm rằng bạn cũng có thể sử dụng "decimal = ','" nếu bạn đang xử lý float.
VessoVit

32

Bạn có thể sử dụng phương thức pandas.Series.str.replace :

df.iloc[:,:].str.replace(',', '').astype(float)

Phương thức này có thể loại bỏ hoặc thay thế dấu phẩy trong chuỗi.


1
Tôi nhận được "AttributeError: đối tượng 'DataFrame' không có thuộc tính 'str'", không biết tại sao ...
krassowski

1
Nhưng công trình này:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

22

Bạn có thể chuyển đổi từng cột một như sau:

df['colname'] = df['colname'].str.replace(',', '').astype(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.