【问题标题】:pandas to_csv float format arbitrary precision without engineering formatingpandas to_csv 浮点格式任意精度,无需工程格式化
【发布时间】:2017-04-25 18:02:19
【问题描述】:

我有一个带有任意大小值的熊猫数据框(其大小是未知的先验),比如:

>>> import pandas as pd
>>> df = pd.DataFrame({'a' : [0.0000001, 2, 3], 'b' : [4, 5000000, 0.6]})

默认显示会将某些数字转换为工程格式

>>> df
              a          b
0  1.000000e-07        4.0
1  2.000000e+00  5000000.0
2  3.000000e+00        0.6

我不在乎。然而,我的目标是将其写入没有工程格式的 csv 文件,同时也不打印不必要的 0。要求的第二部分是控制文件大小,因为有数百万行。

例如,如果我运行df.to_csv(csv_file),那么文件看起来像

,a,b
0,1e-07,4.0
1,2.0,5000000.0
2,3.0,0.6

如果我运行df.to_csv(csv_file, float_format="%.7f"),它看起来像(注意所有不必要的 0):

,a,b
0,0.0000001,4.0000000
1,2.0000000,5000000.0000000
2,3.0000000,0.6000000

我想在输出文件中包含的是:

,a,b
0,0.0000001,4.0
1,2.0,5000000.0
2,3.0,0.6

有没有一种简单的方法来实现这一点?

【问题讨论】:

    标签: python pandas precision export-to-csv


    【解决方案1】:
    import pandas as pd   
    df = pd.DataFrame({'a' : [0.0000001, 2, 3], 'b' : [4, 5000000, 0.6]})   
    
    
    def export_formatted(df, csv_path, cols=None):
    
        # By default, format all columns in df
        if cols==None:
            cols = df.columns
    
        # Change columns to strings with 0's stripped as desired
        for c in cols:
            df[c] = df[c].map('{:,.15f}'.format).str.rstrip('0')
    
        # export
        df.to_csv(csv_path)
    
    export_formatted(df, 'stack_overflow_scratch2.csv')
    

    提供我认为你想要的(下):

        a               b
    0   0.0000001       4
    1   2               5000000
    2   3               0.6
    

    【讨论】:

    • 感谢答案,b/c 不能很好地工作,.7f 必须进行硬编码,但我事先不知道数字有多少个小数。特别是,如果我的数据中有 0.000000001,您的函数会将其截断为 0,对吗?这不是我们想要的结果……
    • 是否有一个小数精度级别,您觉得绝对足够保守?像.15f?因为这样硬编码 .15f 仍然可以,并且您仍然只导出所需的数字。如果你真的想要,你甚至可以使用 float 允许的最大位数。
    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多