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)


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

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)

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

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 .


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()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.