Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521

Pandas, dataframe, to_csv, csvformatter

17.09.2019, 08:19. Показов 8394. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите, пожалуйста.

Делаю экспорт таблицы с помощью класса CSVFormatter в файл csv. Хочу, чтобы везде было по 3 знака после запятой. За знаки после запятой отвечает параметр float_format. Если оставить этот параметр по умолчанию, во всех столбцах получится разное количество знаков. Задаю разные значения этого параметра '%.3f', '%.15f' и тд. На выходной файл вообще не влияет. Результат как при значении по умолчанию. Проверила везде внутри, значение передаётся нормально, как задавала. В чем может быть проблема?

Добавлено через 14 минут
И вообще в этот float_format любую строку можно передать, любой бессмысленный набор символов, и он везде передастся, нигде не вылетит, и результирующий файл будет как по умолчанию.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2019, 08:19
Ответы с готовыми решениями:

Pandas dataframe
Доброго дня форумчане. Возник следующий вопрос. Есть у меня таблица, которую необходимо "перевернуть". Так dataframe...

Dataframe pandas
Всем привет! Есть dataframe книги. Автор1 книга 1 Автор 2 книга 2 Автор 1 книга 3 Как можно сформировать xml файл с...

Pandas Dataframe
я импортирую фрейм данных из excel. Столбец 1 установлен как индекс. Я хочу проверить в индекс (Столбец 1) пустой ячейке с помощью цикла...

33
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
17.09.2019, 14:36  [ТС]
Студворк — интернет-сервис помощи студентам
Посмотрю, спасибо большое!
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 07:25  [ТС]
Не получается исправить.
Во вложении добавленный код и вывод в файл. Просто с телефона долго набирать.
Миниатюры
Pandas, dataframe, to_csv, csvformatter   Pandas, dataframe, to_csv, csvformatter  
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 07:37
Simply me, доброго утречка, коллега. Так, мы поняли, что дело не в формате (я еще у себя поэкспериментирую), тогда придется проверять следующую ступень - сохранение в файл. Можно увидеть ту часть, где прямо сохранение происходит?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 07:56
уже не надо, ты пробовала вот твой пример просто вывести в консоль и посмотреть типы? он считает колонки строковыми! из-за того, что заголовки строками, нужно как то это обойти. Вот смотри ниже пример (плохой, только для того, чтобы показать) я твою структуру из таплов превратил в словарь и тогда он четко отделяет названия колонок от содержимого и не считает их строкой/
Обрати внимание что в случае таплов пандас считает что первый тапл это не названия столбиков! а вот для словаря проблем нет

1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 07:58  [ТС]
Доброе)

Ну вот в классе BW есть функция to_csv, как раз в которую я думаю, какое значение передать параметру float_format. В этой функции создается экземпляр CSVFormatter. И у него вызывается метод save. Код save можно тут посмотреть:

https://github.com/pandas-dev/... ts/csvs.py

В моем файле csvs.py не совсем такой код. Немножко есть различия, связанные с encoding. Но, по-моему, не существенные.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 07:58
нужно найти как заставить пандас первые два кортежа считать заголовками, а не частью колонок
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 08:03  [ТС]
Ясненько! Спасибо, поищу!
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 08:10
Simply me, смотри как выкрутился: в конструкторе указал, что первый тапл это названия колонок, и отсчет начал с 1 ряда (не с 0), задал тип руками, работает. Правда тебе придется тогда вторую колонку с именами или игнорить или добавлять к первой. Ну или гуглить как это обойти
Python
1
2
3
4
5
6
7
8
9
d = [('a', 'b', 'c', 'd'),
     (1.2345, 2.345567, 3.45678, 4.557674),
     (1.4334566, 2.9874598, 3.28746592, 4.39490234)]
 
df = pd.DataFrame(d[1:], columns=d[0], dtype=float) # Вся магия тут!!!
print(df)
 
print('=' * 10)
print(df.to_csv(float_format='%.2f'))
Добавлено через 59 секунд
вывод в консоль:
Python
1
2
3
4
5
6
7
          a         b         c         d
0  1.234500  2.345567  3.456780  4.557674
1  1.433457  2.987460  3.287466  4.394902
==========
,a,b,c,d
0,1.23,2.35,3.46,4.56
1,1.43,2.99,3.29,4.39
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 09:15  [ТС]
А посмотрите еще, пожалуйста, как это адаптировать к моему коду. Что-то не получается. Ошибка. Может, потому что у меня 2 строчки не числовые.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def export_image_csv(self):
    ...
    for item in all_data:
        ...
        res = [...] # числовые данные
        res.insert(0, tuple(names)) # названия
        res.insert(1, tuple(units_row)) # единицы измерения
        ...
        self.write_data_to_file(file_name, res)
        ...
 
def write_data_to_file(self, file_name, data):
    df = DataFrame(data[2:], columns = data[0:1], dtype = float)
    df.to_csv(file_name, float_format = '%.2f', ...)
    ...
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 09:36
Simply me, решение навскидку -объединить в одно название, если это не вариант, то надо думать...
Python
1
2
3
4
5
6
7
8
9
10
res = [(1.2345, 2.345567, 3.45678, 4.557674),
       (1.4334566, 2.9874598, 3.28746592, 4.39490234)]
names = ['Длина', 'Скорость', 'Масса', 'Сила']
units_row = ['м', 'км/ч', 'кг', 'Н']
joined_names = [f'{e} ({units_row[i]})' for i, e in enumerate(names)]
res.insert(0, tuple(joined_names))
 
data = res
df = DataFrame(data[1:], columns=data[0], dtype=float)
df.to_csv(path_or_buf='test.csv', float_format='%.2f')
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 09:39  [ТС]
Спасибо! Сама не могу принимать решения об изменении внешнего вида csv-файла. Спрошу, можно ли объединить.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 10:04
Лучший ответ Сообщение было отмечено Simply me как решение

Решение

Simply me, на почитать тебе multiindex и from_records в pandas, возможно там есть решение
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
18.09.2019, 14:44  [ТС]
Welemir1, посмотрите ещё, пожалуйста! Вот этот код из интернета у меня работает:
Python
1
2
3
4
5
6
7
8
9
10
11
>>> columns = pd.MultiIndex.from_tuples(
...     zip(['date', 'x', 'y', 'z'],
...         ['(yyyy-mm-dd)', '(s)', '(m)', '(kg)']))
>>> data = [['2014-03-12', 1, 2, 3],
...         ['2014-03-13', 4, 5, 6]]
>>> df = pd.DataFrame(data, columns=columns)
>>> df
          date   x   y    z
  (yyyy-mm-dd) (s) (m) (kg)
0   2014-03-12   1   2    3
1   2014-03-13   4   5    6
Но у меня не получается порезать мою переменную data на заголовки и данные правильно. Все время пишет, что не совпадает количество столбцов.
Python
1
2
3
4
columns=MultiIndex.from_tuples(zip(data[0], data[1])
columns=MultiIndex.from_tuples(data[0], data[1])
columns=MultiIndex.from_arrays(zip(data[0], data[1])
columns=MultiIndex.from_arrays(data[0], data[1])
Добавлено через 4 минуты
Поторопилась спросить) как раз первый вариант рабочий! Только одну закрывающую скобку забыла. С телефона набирала. Спасибо!
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
18.09.2019, 15:15
Simply me, рад что заработало, значит не прогадал с мультииндексами )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2019, 15:15
Помогаю со студенческими работами здесь

Выборка в DataFrame Pandas
Подскажите пожалуйста с задачей, не выходит сделать выборку, как в задании в DataFrame Pandas. 1.Оставьте в выборке только те...

Pandas. Объединить DataFrame
Приветствую всех! Коллеги, подскажите. Я спарсил xml файл с помощью xmltodict. Получил два датафрейма (пришлось делать два из-за...

Столбец с условием в pandas dataframe
Всем привет, есть dataframe, необходимо добавить столбец d, который бы вычислялся на основе условий содержимого столбцов a,b,c. import...

Сравнение Dataframe через Pandas
Добрый вечер уважаемые форумчане! На данный момент нахожусь на начальном этапе обучения языка Python 3 версии. Мне необходимо...

Сложные структуры Pandas DATAFRAME
Здраствуйте уважаемые знатоки! Подскажите пожалуйста способ при котором можно обработать нижеследующую структуру. Общий смысл просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru