จัดรูปแบบ / ระงับสัญลักษณ์ทางวิทยาศาสตร์จาก Python Pandas Aggregation Results


162

หนึ่งสามารถปรับเปลี่ยนรูปแบบสำหรับการส่งออกจากการดำเนินงาน groupby ในแพนด้าที่ผลิตสัญกรณ์ทางวิทยาศาสตร์สำหรับจำนวนมาก?

ฉันรู้วิธีการจัดรูปแบบสตริงในไพ ธ อน แต่ฉันรู้สึกแย่เมื่อพูดถึงการประยุกต์ใช้ที่นี่

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

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

นี่เป็นการยับยั้งสัญกรณ์วิทยาศาสตร์ถ้าฉันแปลงเป็นสตริง แต่ตอนนี้ฉันแค่สงสัยว่าจะจัดรูปแบบสตริงและเพิ่มทศนิยมได้อย่างไร

sum_sales_dept.astype(str)


3
ฉันเห็นคำถามนั้น แต่ฉันไม่แน่ใจว่ามันช่วยฉันได้อย่างไร ฉันแค่มองหาเพื่อรักษา dtype ปัจจุบันซึ่งลอยและเพียงแสดงทศนิยมทั้งหมดในผลลัพธ์แทนสัญกรณ์ทางวิทยาศาสตร์
horatio1701d

นั่นอาจเป็นเพียงสิ่งที่แสดง แต่ถ้าคุณคิดว่ามีบางอย่างเกี่ยวกับปัญหาของคุณทำให้คุณแตกต่างจากลิงค์ของ Dan คุณต้องโพสต์ข้อมูลเพิ่มเติมเกี่ยวกับปัญหาของคุณโดยเฉพาะกับชุดข้อมูลขนาดเล็กที่สร้างปัญหาขึ้นมาใหม่ อะไรคือdtypesผลลัพธ์ของคุณ
TomAugspurger

คำตอบ:


237

จริงอยู่คำตอบที่ฉันเชื่อมโยงในความคิดเห็นไม่เป็นประโยชน์ คุณสามารถระบุตัวแปลงสตริงของคุณได้

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

ฉันไม่แน่ใจว่าเป็นวิธีที่เหมาะสมในการทำเช่นนี้หรือไม่ แต่ใช้งานได้

การแปลงตัวเลขเป็นสตริงอย่างหมดจดเพื่อวัตถุประสงค์ด้านสุนทรียะดูเหมือนว่าเป็นความคิดที่ไม่ดี แต่ถ้าคุณมีเหตุผลที่ดีนี่เป็นวิธีหนึ่ง:

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
ขอบคุณแดน คุณรู้วิธีรีเซ็ตตัวเลือกแพนด้าหรือไม่
Josh

1
@Josh หากต้องการตั้งค่าตัวเลือกชั่วคราวในหมีแพนด้าคุณสามารถใช้pandas.option_context(ดูpandas.pydata.org/pandas-docs/stable/generated/ ...... )
muellermarkus

มันมักจะไม่ได้มีวัตถุประสงค์เพื่อความงาม แต่สำหรับ skimming ข้อมูลที่รวดเร็วผ่านเยื่อหุ้มสมองมองเห็นมากกว่าดาต้าเฟรมตัวเลขขนาดใหญ่
matanster

pd.set_option ('display.float_format', แลมบ์ดา x: '% .3f'% x) ก็ทำงานให้ฉันด้วยเช่นกัน
driven_spider

5
วิธีนี้ใช้ได้ผลและคุณยังสามารถใช้สัญกรณ์ f-string ที่ใหม่กว่าได้ เช่น pd.set_option('display.float_format', lambda x: f'{x:,.3f}')ถ้าคุณต้องการตัวคั่นหลักพันเช่นกัน
576i

87

นี่เป็นอีกวิธีในการทำเช่นเดียวกับคำตอบของ Dan Allanแต่ไม่มีฟังก์ชั่นแลมบ์ดา:

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

หรือ

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

1
ฉันคิดว่าการใช้สตริงรูปแบบจะเข้าถึงสมาชิกทีมที่คุ้นเคยกับ Python ได้น้อยกว่าและอาจไม่เข้าใจฟังก์ชันแลมบ์ดา
Steven C. Howell

23

คุณสามารถใช้ฟังก์ชัน round เพื่อระงับสัญกรณ์ทางวิทยาศาสตร์สำหรับ dataframe เฉพาะ

df1.round(4)

หรือคุณสามารถระงับได้ทั่วโลกโดย:

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

11

หากคุณต้องการจัดรูปแบบการแสดงผลของกรอบข้อมูลในเซลล์โน๊ตบุ๊ค jupyter คุณสามารถตั้งค่าสไตล์การแสดงผลตามข้อมูลต่อฐานข้อมูล:

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

ป้อนคำอธิบายรูปภาพที่นี่

โปรดดูเอกสารที่นี่


0

หากคุณต้องการใช้ค่าต่างๆพูดเป็นส่วนหนึ่งของ csvfile csv.writer คุณสามารถจัดรูปแบบตัวเลขก่อนที่จะสร้างรายการ:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.