Вывести различную точность по столбцам с помощью 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
Ответы
Ответ 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})))