2017-04-25 3 views
0

J'ai un dataframe de pandas géants avec de grandes et petites arbitraires valeurs (dont la valeur est inconnue un priori), disent:pandas géants to_csv flotter le format de précision arbitraire sans ingénierie formating

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

L'affichage par défaut permet de convertir certains numéros au format d'ingénierie

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

ce que je ne me soucie pas. Mon but, cependant, est d'écrire ceci dans un fichier csv sans le format d'ingénierie, tout en n'imprimant pas les 0 inutiles non plus. La deuxième partie de l'exigence consiste à contrôler la taille du fichier puisqu'il existe des millions de lignes.

Par exemple, si je lance df.to_csv(csv_file) le fichier ressemble

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

Si je lance df.to_csv(csv_file, float_format="%.7f") il ressemble (notez tous les 0s inutiles):

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

Ce que je comme avoir dans le fichier de sortie est:

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

Y at-il un moyen simple de atteindre cela?

Répondre

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

fourni ce que je pense que vous voulez (ci-dessous):

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

Thx pour la réponse, ne fonctionne pas tout à fait b/c la '.7f' doit être codé en dur mais je ne savoir à l'avance combien de nombres décimaux sont les nombres. En particulier, s'il y a un 0.000000001 dans mes données, votre fonction le tronquera à 0, n'est-ce pas? Ce n'est pas le résultat escompté ... – Zhang18

+0

Y a-t-il un niveau de précision décimale qui vous semble confortable et suffisamment conservateur? Comme .15f? Parce que le codage en dur .15f est toujours correct et vous n'exportez toujours que les chiffres dont vous avez besoin. Vous pouvez même utiliser les chiffres max autorisés par float si vous le voulez vraiment. –