Formater / supprimer la notation scientifique des résultats d'agrégation Python Pandas

162

Comment modifier le format de sortie d'une opération groupby dans les pandas qui produit une notation scientifique pour de très grands nombres?

Je sais comment faire le formatage de chaînes en python mais je suis perdu quand il s'agit de l'appliquer ici.

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

Cela 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)
horatio1701d
la source
3
J'ai vu cette question mais je ne sais pas comment cela m'aide. Je cherche juste à préserver le dtype actuel qui est float et à afficher simplement toutes les décimales dans le résultat au lieu de la notation scientifique.
horatio1701d
C'est probablement juste une chose d'affichage. Mais si vous pensez qu'il y a quelque chose de particulier dans votre problème qui rend le vôtre différent de celui du lien de Dan, vous devez publier plus d'informations sur votre problème, de préférence avec un petit ensemble de données qui reproduit le problème. Quels sont également dtypesvos résultats?
TomAugspurger

Réponses:

237

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 sais pas si c'est la meilleure façon de procéder, mais cela fonctionne.

La conversion de nombres en chaînes à des fins purement esthétiques semble être une mauvaise idée, mais si vous avez une bonne raison, c'est dans un sens:

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
Dan Allan
la source
1
Merci Dan. Savez-vous comment réinitialiser les options des pandas?
Josh
1
@Josh Pour définir temporairement les options dans les pandas, vous pouvez utiliser pandas.option_context(voir pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus
Ce n'est souvent pas à des fins esthétiques, mais pour un survol plus rapide des informations via le cortex visuel sur de grandes trames de données numériques.
matanster le
pd.set_option ('display.float_format', lambda x: '% .3f'% x) a fonctionné pour moi aussi
conduit_spider
5
Cela fonctionne et vous pouvez également utiliser la nouvelle notation f-string. Comme pd.set_option('display.float_format', lambda x: f'{x:,.3f}')si vous vouliez aussi un séparateur de milliers.
576i
87

Voici une autre façon de le faire, similaire à la 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)
tfhans
la source
1
Je pense que l'utilisation d'une chaîne de format serait plus accessible aux membres de l'équipe qui sont moins familiers avec Python et pourraient ne pas comprendre les fonctions lambda.
Steven C. Howell
23

Vous pouvez utiliser la fonction round juste pour supprimer la notation scientifique pour une trame de données spécifique:

df1.round(4)

ou vous pouvez supprimer est globalement en:

pd.options.display.float_format = '{:.4f}'.format
Vlad Bezden
la source
11

Si vous souhaitez styliser la sortie d'une trame de données dans une cellule de notebook Jupyter, vous pouvez définir le style d'affichage par trame de données:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

entrez la description de l'image ici

Consultez la documentation ici .

Florestan
la source
0

Si vous souhaitez utiliser les valeurs, par exemple dans le cadre de csvfile csv.writer, les nombres peuvent être formatés avant de créer une liste:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
mal242
la source