2017-04-25 73 views
0

我有任意的大,小值的熊貓數據框(其大小是未知先驗),說:大熊貓to_csv浮點格式任意精度的無工程格式化

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

是否有一種簡單的方法實現那個?

回答

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 
+0

THX的答案,完全不是那麼回事B/C的'.7f'必須被硬編碼,但我不知道事先知道數字有多少小數。特別是,如果我的數據中有一個0.000000001,你的函數將截斷爲0,對吧?這不是預期的結果... – Zhang18

+0

您覺得舒適的小數精度是否足夠保守?像.15f?因爲硬編碼.15f仍然正常,您仍然只導出您需要的數字。如果你真的想要,你甚至可以使用float允許的最大數字。 –