Formatear / suprimir la notación científica de los resultados de la agregación de Python Pandas

162

¿Cómo se puede modificar el formato para la salida de una operación groupby en pandas que produce notación científica para números muy grandes?

Sé cómo formatear cadenas en Python, pero estoy perdido cuando se trata de aplicarlo aquí.

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

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

Esto suprime la notación científica si convierto a cadena pero ahora me pregunto cómo formatear cadenas y agregar decimales.

sum_sales_dept.astype(str)
horatio1701d
fuente
2
posible duplicado de la supresión de la notación científica en los pandas?
Dan Allan
3
Vi esa pregunta pero no estoy seguro de cómo eso me ayuda. Solo estoy buscando preservar el dtype actual que es flotante y simplemente mostrar todos los decimales en el resultado en lugar de la notación científica.
horatio1701d
Probablemente sea solo una cosa de exhibición. Pero si cree que hay algo en particular acerca de su problema que hace que el suyo sea diferente al del enlace de Dan, entonces debe publicar más información sobre su problema, preferiblemente con un pequeño conjunto de datos que reproduzca el problema. Además, ¿cuáles son los dtypesresultados?
TomAugspurger

Respuestas:

237

De acuerdo, la respuesta que vinculé en los comentarios no es muy útil. Puede especificar su propio convertidor de cadena de esta manera.

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

No estoy seguro de si esa es la forma preferida de hacer esto, pero funciona.

La conversión de números a cadenas solo con fines estéticos parece una mala idea, pero si tiene una buena razón, esta es una forma:

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
fuente
1
Gracias Dan. ¿Sabes cómo restablecer las opciones de pandas?
Josh el
1
@ Josh Para configurar temporalmente las opciones en pandas, puede usar pandas.option_context(ver pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus
A menudo no es para fines estéticos, sino para un roce más rápido de la información a través de la corteza visual sobre grandes marcos de datos numéricos.
matanster
pd.set_option ('display.float_format', lambda x: '% .3f'% x) también funcionó para mí
driven_spider
55
Esto funciona y también puede usar la notación más nueva de f-string. Como pd.set_option('display.float_format', lambda x: f'{x:,.3f}')si también quieres un separador de mil.
576i
87

Aquí hay otra forma de hacerlo, similar a la respuesta de Dan Allan pero sin la función lambda:

>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0    0.41
1    0.99
2    0.10

o

>>> pd.set_option('display.float_format', '{:.2f}'.format)
tfhans
fuente
1
Creo que usar una cadena de formato sería más accesible para los miembros del equipo que están menos familiarizados con Python y podrían no entender las funciones lambda.
Steven C. Howell
23

Puede usar la función redonda solo para suprimir la notación científica para un marco de datos específico:

df1.round(4)

o puede suprimirlo globalmente:

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

Si desea aplicar un estilo a la salida de un marco de datos en una celda del cuaderno jupyter, puede establecer el estilo de visualización en función de cada marco de datos:

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

ingrese la descripción de la imagen aquí

Vea la documentación aquí .

Florestan
fuente
0

Si desea utilizar los valores, por ejemplo, como parte de csvfile csv.writer, los números se pueden formatear antes de crear una lista:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
evil242
fuente