Comment modifier le format de sortie d'une opération groupby dans pandas produisant une notation scientifique pour de très grands nombres?
Je sais comment formater une chaîne dans python, mais je ne sais pas trop comment l'appliquer ici.
df1.groupby('dept')['data1'].sum()
dept
value1 1.192433e+08
value2 1.293066e+08
value3 1.077142e+08
Ceci supprime la notation scientifique si je convertis en chaîne, mais maintenant je me demande simplement comment formater une chaîne et ajouter des décimales.
sum_sales_dept.astype(str)
Certes, la réponse que j'ai liée dans les commentaires n'est pas très utile. Vous pouvez spécifier votre propre convertisseur de chaîne comme ceci.
In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)
In [28]: Series(np.random.randn(3))*1000000000
Out[28]:
0 -757322420.605
1 -1436160588.997
2 -1235116117.064
dtype: float64
Je ne suis pas sûr que ce soit la façon préférée de le faire, mais cela fonctionne.
Convertir des nombres en chaînes uniquement à des fins esthétiques semble être une mauvaise idée, mais si vous avez une bonne raison, procédez comme suit:
In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
Out[6]:
0 0.026
1 -0.482
2 -0.694
dtype: object
Voici une autre façon de le faire, similaire à réponse de Dan Allan mais sans la fonction lambda:
>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0 0.41
1 0.99
2 0.10
ou
>>> pd.set_option('display.float_format', '{:.2f}'.format)
Vous pouvez utiliser la fonction round uniquement pour supprimer la notation scientifique pour une image donnée:
df1.round(4)
ou vous pouvez supprimer est globalement par:
pd.options.display.float_format = '{:.4f}'.format
Si vous souhaitez styliser la sortie d'un bloc de données dans une cellule du bloc-notes Jupyter, vous pouvez définir le style d'affichage par base de données:
df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")
Voir la documentation ici .
Si vous souhaitez utiliser les valeurs, disons dans le cadre de csvfile csv.writer, les nombres peuvent être formatés avant la création d'une liste:
df['label'].apply(lambda x: '%.17f' % x).values.tolist()