#python #pandas #dataframe
Вопрос:
Я экспортирую базу данных SQL в csv
using Pandas.read_sql_query
df.to_csv
, и у меня проблема с тем, что целочисленные поля представлены в виде float в фрейме данных.
Мой код:
conn = pymysql.connect(server, port)
chunk = pandas.read_sql_query('''select * from table''', conn)
df = pandas.DataFrame(chunk) # here int values are float
df.to_csv()
Я экспортирую несколько таблиц таким образом, и проблема в том, что int
поля экспортируются как float
(с точкой). Кроме того, я заранее не знаю, какой столбец какого типа (код должен быть общим для всех таблиц)
Однако моя цель — экспортировать все как есть- в строках
То, что я пробовал (без успеха):
df.applymap(str)
read_sql_query(coerce_float=False)
df.fillna('')
DataFrame(dtype=object)
/DataFrame(dtype=str)
Конечно, я могу затем обработать данные для приведения к целым числам, но было бы лучше сделать это во время первоначального импорта
UPD: В моем наборе данных есть NULL
значения. Их следует заменить пустыми строками (так как цель состоит в том, чтобы преобразовать все столбцы в строки).
Комментарии:
1. Имеют ли значения целочисленные столбцы SQL
NULL
? Панды принуждают их кnp.nan
, что является поплавком, который, в свою очередь, принуждает весь столбец к типу dtype с плавающей точкой. Если в этом проблема, то «ручное» принудительное преобразование столбца в целое число после первоначального импорта, вероятно, является вашей лучшей альтернативой.
Ответ №1:
Панды выводят тип данных из образца данных. Если целочисленный столбец имеет нулевые значения, pandas присваивает ему тип данных с плавающей точкой, потому что NaN имеет тип с плавающей точкой и потому что pandas основан на numpy, который не имеет целочисленного типа с нулевым значением. Поэтому постарайтесь убедиться, что у вас нет нулей или что нулевые значения заменяются на 0, если это имеет смысл в вашем наборе данных, поскольку 0 является целым числом.
КРОМЕ того, другим способом сделать это было бы указать типы dtypes при импорте данных, но вы должны использовать специальный тип целого числа, например Int64Dtype, в соответствии с документами:
"If you need to represent integers with possibly missing values, use one of the nullable-integer extension dtypes provided by pandas"
Комментарии:
1. Я обновил вопрос. Таблица имеет нулевые значения, но их следует игнорировать. Т. Е. импорт должен быть достаточно надежным, чтобы получить все в виде строк (пустая строка)
2. Я также обновил свой ответ, если вы используете целочисленный dtype с нулевым значением, он должен работать.
Ответ №2:
Поэтому я нашел решение путем последующей обработки данных (принудительное преобразование в строки) с помощью applymap:
def convert_to_int(x):
try:
return str(int(x))
except:
return x
df = df.applymap(convert_to_int)
Этот шаг занимает значительное время для обработки, однако решает мою проблему