2017-04-25 3 views
0

ich Pandas Datenrahmen mit beliebig großen und kleinen Werten habe (deren Größe unbekannt a priori), sagen:Pandas to_csv Format beliebige Genauigkeit zu schweben ohne Engineering Formating

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

Die Standardanzeige bestimmte Zahlen konvertieren zum technischen Format

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

was mir egal ist. Mein Ziel ist es jedoch, dies in eine CSV-Datei ohne das Engineering-Format zu schreiben, während nicht unnötig 0s drucken. Der zweite Teil der Anforderung besteht darin, die Dateigröße zu kontrollieren, da es Millionen von Zeilen gibt.

Zum Beispiel, wenn ich df.to_csv(csv_file) laufen dann die Datei sieht aus wie

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

Wenn ich df.to_csv(csv_file, float_format="%.7f") laufen dann wie es aussieht (alle unnötigen 0s bemerken):

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

Was würde ich wie in der Ausgabedatei haben ist:

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

gibt es eine einfache Möglichkeit, das erreichen?

Antwort

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

zur Verfügung gestellt, was ich glaube, Sie wollen (siehe unten):

a    b 
0 0.0000001  4 
1 2    5000000 
2 3    0.6 
+0

Thx für die Antwort, funktioniert nicht ganz b/c der '.7f' hat hart codiert werden, aber ich weiß nicht Im Voraus wissen, wie viele Dezimalstellen die Zahlen sind. Insbesondere, wenn es in meinen Daten einen Wert von 0,000000001 gibt, wird Ihre Funktion ihn auf 0 abschneiden, oder? Das ist nicht das gewünschte Ergebnis ... – Zhang18

+0

Gibt es ein Niveau der Dezimalgenauigkeit, das Sie sich wohl fühlen, ist auf jeden Fall konservativ genug? Wie .15f? Denn dann ist hardcoding .15f immer noch in Ordnung und Sie exportieren nur die Ziffern, die Sie benötigen. Sie könnten sogar die von float erlaubten Max-Ziffern verwenden, wenn Sie wirklich wollen. –

Verwandte Themen