Предотвратите конечный ноль с пандами "to_csv" - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь экспортировать строку CSV в веб-приложение D3, но команда to_csv настаивает на добавлении конечного 0 к данным, что препятствует правильному использованию D3.

Вотминимальный пример для иллюстрации проблемы.

Мой (упрощенный) фрейм данных:

>>> df = pd.DataFrame([['Alex',20.0000, 50.650]],columns=['Name','Age', 'Weight'])
   Name   Age  Weight
0  Alex  20.0   50.65

df['Age'] содержит float, как указано:

>>> df['Age']
0    20.0
Name: Age, dtype: float64

Затем, основываясь на этом ответе , я запускаю .astype(object), чтобы получить желаемый формат:

>>> df=df.astype(object)
   Name Age Weight
0  Alex  20  50.65

Теперь df['Age'] содержит object без конечного нуля:

>>> df['Age']
0    20
Name: Age, dtype: object

Это то, что я хотел бы экспортировать с to_csv, но эта команда снова добавляет завершающий 0 к числу, которого я хочу избежать:

>>> df_csv = df.to_csv(sep=',', index = False)
>>> df_csv
'Name,Age,Weight\nAlex,20.0,50.65\n'

Я пытался использоватьdf_csv = df.to_csv(sep=',', index = False, float_format='%.0f') на основе этого ответа , но это не сработает, потому что в моем фрейме данных есть другие числа с плавающей запятой, для которых я хочу сохранить ненулевые десятичные дроби.

Как можно это предотвратить?конечный 0 для чисел без десятичных знаков?

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

Другой способ использования Pandas заменяет:

df = df.astype(str)
df = df.replace(to_replace = "\.0+$",value = "", regex = True)

Таким образом, вам не нужно импортировать дополнительный модуль.

0 голосов
/ 28 мая 2019

Вот один способ, который будет работать, если у вас нет пробелов в строковых столбцах.

Используйте to_string() после astype(object) вместо to_csv().Это сохранит числовые форматы, но будет использовать пробелы в качестве разделителя.Если у вас нет пробелов ни в одном из ваших других полей, вы можете использовать регулярные выражения для преобразования пробелов в запятые.

import re
df = df.astype(object)
df_string = re.sub(" +", ",", df.to_string(index=False))
print(df_string)
#Name,Age,Weight
#Alex,20,50.65

Теперь напишите df_string в ваш файл:

with open('path/to/some/file.csv', 'w') as f:
    f.write(df_string)
0 голосов
/ 28 мая 2019

Вы пробовали df['Age'] = df['Age'].astype(int)

, это дает мне

    Name    Age     Weight
0   Alex    20  50.65

преобразование столбца в тип object, по существу, позволяет столбцу содержать числа с плавающей запятой, целые числа, строки и т. Д. Противтипизированный столбец, который будет содержать только этот тип.

И преобразовать его в CSV:

df_csv = df.to_csv(sep=',', index = False)

'Name,Age,Weight\r\nAlex,20,50.65\r\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...