Аргументы pandas to_csv float_format и десятичное число не работают для индексного столбца

Фон

Я делаю некоторые симуляции соответственно. системный анализ с изменением параметров (в данном случае только rpm) и добавление каждой последней строки фрейма данных результатов results_df к резюмирующему фрейму данных df, содержащему оценку моей системы в зависимости от различных rpm.

Чтобы получить соответствующий индекс для построения графика и анализа данных, я преобразовал различные значения (здесь rpm) из списка в серию pandas ser и объединил эту серию с обобщающим фреймом данных df, содержащим интересующие меня результаты.

Поскольку результаты каждого вычисления, которые меня интересуют, - это только последняя строка каждого вычисления, я извлекаю эти данные из кадра данных результатов results_df с помощью .tail(1).

То, что я сделал до сих пор, показано в следующем фрагменте:

rpm = [0.25, 0.3, 0.5, 0.75, 1.0, 1.5, 2.0]

ser = pd.Series(rpm, name='rpm')
df = pd.DataFrame()
df_list = list()

for i, val in enumerate(rpm):
    results_df = get_some_data_from_somwhere()
    df_list.append(results_df.tail(1))

df = df.append(df_list, ignore_index=True)
df = pd.concat([df, ser], axis=1)
df.set_index('rpm', inplace=True)


with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')

Проблема

Этот CSV-файл, который я получаю, имеет следующий формат:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0.25 303,317 323,372 302,384 324,332

Однако я ожидал наличия трех десятичных цифр и запятой в качестве десятичного знака в моем индексном столбце, как показано здесь:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0,250 303,317 323,372 302,384 324,332

Таким образом, кажется, что параметры знака index и decimal не применяются к столбцу индекса при экспорте фреймов данных в csv-файлы с помощью команды .to_csv.

Как я могу добиться такого поведения, поскольку параметр index установлен True и все значения (за исключением столбца индекса) имеют правильный формат и десятичный знак?

Должен ли я обрабатывать индексный столбец как-то отдельно?


person albert    schedule 23.07.2015    source источник
comment
Обходной путь - сделать data.reset_index().to_csv(index=False ...   -  person firelynx    schedule 23.07.2015
comment
Кроме того, вы можете сделать data.to_csv('foo.csv'... вам не нужно давать ему поток.   -  person firelynx    schedule 23.07.2015
comment
@firelynx: файл закрывается автоматически после экспорта данных? Это как-то актуально, так как несколько месяцев назад я превысил максимальное количество открытых файлов...   -  person albert    schedule 23.07.2015
comment
Да, он закрывает файл после себя. Я думаю, что в целом безопаснее позволить пандам заниматься обработкой файлов, поскольку тогда логика хранится в одном месте, а не во всех местах, где вы делаете .to_csv   -  person firelynx    schedule 23.07.2015
comment
Вместо этого я написал свои два пункта как правильный ответ с немного большей проработкой.   -  person firelynx    schedule 23.07.2015


Ответы (1)


Я бы переписал ваши две нижние строки:

with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')

В

data.reset_index().to_csv('foo.csv', index=False, header=True, decimal=',', sep=' ', float_format='%.3f')

Это небольшой обходной путь, но, как вы заметили, аргументы ключевого слова decimal= и float_format= работают только со столбцами data, а не с индексом.

Вместо этого я помещаю индекс в фрейм данных с помощью reset_index, а затем говорю to_csv(index=False не сохранять индекс в файл (поскольку он теперь находится в данных).

Кроме того, открытие файлового потока самостоятельно (with open('foo.csv', 'w') as f:) лучше предоставить pandas, который делает это сам по себе, когда вы просто даете ему строку 'foo.csv' в качестве первого аргумента.

person firelynx    schedule 23.07.2015