Est-il possible de spécifier une précision flottante spécifiquement pour chaque colonne à imprimer par la méthode de package Python pandas
pandas.DataFrame.to_csv ?
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
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.
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')
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))
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')
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})))