Подтвердить что ты не робот

Вывести различную точность по столбцам с помощью pandas.DataFrame.to_csv()?

Вопрос

Можно ли указать точность float для каждого столбца, который должен быть распечатан с помощью метода пакета Python pandas pandas.DataFrame.to_csv?

Фон

Если у меня есть фреймворк pandas, который устроен так:

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

Существует опция float_format, которая может использоваться для указания точности, но при этом применяется эта точность ко всем столбцам фрейма данных.

Когда я использую это так:

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

Я получаю следующее, где vals задана неточная точность:

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
4b9b3361

Ответ 1

Вы можете сделать это с помощью to_string. Существует аргумент formatters, в котором вы можете указать имена колонок для formatters. Затем вы можете использовать некоторое регулярное выражение для замены разделителей столбцов по умолчанию с помощью вашего разделителя.

Ответ 2

Измените тип столбца "vals" перед экспортом фрейма данных в файл 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')

Ответ 3

Более свежая версия первой строки hknust будет выглядеть так:

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

Для печати без научной записи:

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

Ответ 4

Вы можете использовать round метод для dataframe, прежде чем сохранять файл данных в файл.

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

Ответ 5

Подход to_string, предложенный @mattexx, выглядит лучше для меня, поскольку он не изменяет dataframe.

Он также хорошо обобщается при использовании jupyter ноутбуков, чтобы получить отличный вывод HTML, используя метод to_html. Здесь мы устанавливаем новую стандартную точность по умолчанию 4 и переопределяем ее, чтобы получить 5 цифр для определенного столбца 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})))