Salida de diferente precisión por columna con pandas.DataFrame.to_csv ()?

Pregunta

¿Es posible especificar una precisión flotante específicamente para cada columna que se imprimirá con el método del paquete pandas Python pandas.DataFrame.to_csv ?

Fondo

Si tengo un dataframe de pandas que se organiza así:

 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 

Existe la opción float_format que se puede usar para especificar una precisión, pero esto aplica esa precisión a todas las columnas del dataframe cuando se imprime.

Cuando lo uso así:

 df_data.to_csv(outfile, index=False, header=False, float_format='%11.6f') 

Obtengo lo siguiente, donde a los vals se les da una precisión inexacta:

 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 

Puedes hacer esto con to_string . Hay un argumento de formatters donde puede proporcionar un dictado de nombres de columnas a los formateadores. Luego puede usar alguna expresión regular para reemplazar los separadores de columna predeterminados con el delimitador de su elección.

Cambie el tipo de columna “vals” antes de exportar el dataframe a un archivo 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') 

Una versión más actual de la primera línea de hknust sería:

 df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1}'.format(x)) 

Para imprimir sin notación científica:

 df_data['vals'] = df_data['vals'].map(lambda x: '{0:.1f}'.format(x)) 

Puede usar el método de redondeo para el dataframe antes de guardar el dataframe en el archivo.

 df_data = df_data.round(6) df_data.to_csv('myfile.dat') 

El enfoque to_string sugerido por @mattexx me parece mejor, ya que no modifica el dataframe.

También se generaliza bien cuando se usan cuadernos jupyter para obtener una salida HTML bonita, a través del método to_html . Aquí establecemos una nueva precisión predeterminada de 4 y la anulamos para obtener 5 dígitos para una columna en particular 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})))