Định dạng / Loại bỏ ký hiệu khoa học từ kết quả tổng hợp Python Pandas


162

Làm thế nào người ta có thể sửa đổi định dạng cho đầu ra từ một hoạt động nhóm trong gấu trúc tạo ra ký hiệu khoa học cho số lượng rất lớn?

Tôi biết cách thực hiện định dạng chuỗi trong python nhưng tôi không biết gì khi áp dụng nó ở đây.

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

Điều này loại bỏ ký hiệu khoa học nếu tôi chuyển đổi thành chuỗi nhưng bây giờ tôi chỉ tự hỏi làm thế nào để định dạng chuỗi và thêm số thập phân.

sum_sales_dept.astype(str)


3
Tôi thấy câu hỏi đó nhưng tôi không chắc nó giúp tôi như thế nào. Tôi chỉ đang tìm cách bảo tồn loại dtype hiện tại đang trôi nổi và chỉ đơn giản là hiển thị tất cả số thập phân trong kết quả thay vì ký hiệu khoa học.
horatio1701d

Đó có lẽ chỉ là một điều hiển thị. Nhưng nếu bạn nghĩ có điều gì đó đặc biệt về vấn đề của bạn khiến bạn khác với liên kết của Dan thì bạn cần đăng thêm thông tin về vấn đề của mình, tốt nhất là với một tập dữ liệu nhỏ tái tạo vấn đề. Ngoài ra dtypeskết quả của bạn là gì?
TomAugspurger

Câu trả lời:


237

Cấp, câu trả lời tôi liên kết trong các ý kiến ​​không phải là rất hữu ích. Bạn có thể chỉ định trình chuyển đổi chuỗi của riêng bạn như vậy.

In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)

In [28]: Series(np.random.randn(3))*1000000000
Out[28]: 
0    -757322420.605
1   -1436160588.997
2   -1235116117.064
dtype: float64

Tôi không chắc đó có phải là cách ưa thích để làm việc này không, nhưng nó hoạt động.

Chuyển đổi số thành chuỗi hoàn toàn cho mục đích thẩm mỹ có vẻ là một ý tưởng tồi, nhưng nếu bạn có lý do chính đáng, đây là một cách:

In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
Out[6]: 
0     0.026
1    -0.482
2    -0.694
dtype: object

1
Cảm ơn Dân. Bạn có biết làm thế nào để thiết lập lại tùy chọn gấu trúc?
Josh

1
@Josh Để tạm thời đặt tùy chọn trong gấu trúc, bạn có thể sử dụng pandas.option_context(xem pandas.pydata.org/pandas-docs/urdy/generated/ Lỗi ).
muellermarkus

Đôi khi, nó không nhằm mục đích thẩm mỹ, mà để lướt qua thông tin nhanh hơn thông qua vỏ thị giác trên các tệp dữ liệu số lớn.
matanster

pd.set_option ('display.float_format', lambda x: '% .3f'% x) cũng hoạt động với tôi
drive_spider

5
Điều này hoạt động và bạn cũng có thể sử dụng ký hiệu chuỗi f mới hơn. Giống như pd.set_option('display.float_format', lambda x: f'{x:,.3f}')nếu bạn muốn một ngàn phân cách là tốt.
576i

87

Đây là một cách khác để làm điều đó, tương tự như câu trả lời của Dan Allan nhưng không có chức năng lambda:

>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0    0.41
1    0.99
2    0.10

hoặc là

>>> pd.set_option('display.float_format', '{:.2f}'.format)

1
Tôi nghĩ rằng việc sử dụng một chuỗi định dạng sẽ dễ tiếp cận hơn với các thành viên nhóm ít quen thuộc với Python và có thể không hiểu các hàm lambda.
Steven C. Howell

23

Bạn có thể sử dụng hàm tròn chỉ để loại bỏ ký hiệu khoa học cho khung dữ liệu cụ thể:

df1.round(4)

hoặc bạn có thể ngăn chặn trên toàn cầu bằng cách:

pd.options.display.float_format = '{:.4f}'.format

11

Nếu bạn muốn định kiểu đầu ra của khung dữ liệu trong ô sổ ghi chép jupyter, bạn có thể đặt kiểu hiển thị trên cơ sở mỗi khung dữ liệu:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

nhập mô tả hình ảnh ở đây

Xem tài liệu ở đây .


0

Nếu bạn muốn sử dụng các giá trị, giả sử là một phần của csvfile csv.writer, các số có thể được định dạng trước khi tạo danh sách:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
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.