web-dev-qa-db-fra.com

Afficher une précision différente par colonne avec pandas.DataFrame.to_csv ()?

Question

Est-il possible de spécifier une précision flottante spécifiquement pour chaque colonne à imprimer par la méthode de package Python pandaspandas.DataFrame.to_csv ?

Contexte

Si j'ai un cadre de données pandas qui est organisé comme ceci:

In [53]: df_data[:5]
Out[53]: 
    year  month  day       lats       lons  vals
0   2012      6   16  81.862745 -29.834254   0.0
1   2012      6   16  81.862745 -29.502762   0.1
2   2012      6   16  81.862745 -29.171271   0.0
3   2012      6   16  81.862745 -28.839779   0.2
4   2012      6   16  81.862745 -28.508287   0.0

Il y a le float_format option qui peut être utilisée pour spécifier une précision, mais cela applique cette précision à toutes les colonnes de la trame de données lors de l'impression.

Quand j'utilise ça comme ça:

df_data.to_csv(outfile, index=False,
                   header=False, float_format='%11.6f')

J'obtiens ce qui suit, où vals reçoit une précision inexacte:

2012,6,16,  81.862745, -29.834254,   0.000000
2012,6,16,  81.862745, -29.502762,   0.100000
2012,6,16,  81.862745, -29.171270,   0.000000
2012,6,16,  81.862745, -28.839779,   0.200000
2012,6,16,  81.862745, -28.508287,   0.000000
29
ryanjdillon

Vous pouvez le faire avec to_string . Il existe un argument formatters dans lequel vous pouvez fournir un dict des noms de colonnes aux formateurs. Ensuite, vous pouvez utiliser une expression rationnelle pour remplacer les séparateurs de colonnes par défaut par le délimiteur de votre choix.

3
mattexx

Modifiez le type de colonne "vals" avant d'exporter le bloc de données vers un fichier CSV

df_data['vals'] = df_data['vals'].map(lambda x: '%2.1f' % x)

df_data.to_csv(outfile, index=False, header=False, float_format='%11.6f')
32
hknust

La version la plus récente de la première ligne de hknust serait:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1}'.format(x))

Pour imprimer sans notation scientifique:

df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1f}'.format(x)) 
5

Vous pouvez utiliser la méthode round pour la trame de données avant d'enregistrer la trame de données dans le fichier.

df_data = df_data.round(6)
df_data.to_csv('myfile.dat')
4
Peaceful

Le to_string l'approche suggérée par @mattexx me semble meilleure, car elle ne modifie pas la trame de données.

Il se généralise également bien lors de l'utilisation de blocs-notes jupyter pour obtenir une jolie sortie HTML, via le to_html méthode. Ici, nous définissons une nouvelle précision par défaut de 4, et la remplaçons pour obtenir 5 chiffres pour une colonne particulière wider:

from IPython.display import HTML
from IPython.display import display

pd.set_option('precision', 4)

display(HTML(df.to_html(formatters={'wider': '{:,.5f}'.format})))
2
nealmcb