Pandas.read_sql_query считывает int как float

#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 (с точкой). Кроме того, я заранее не знаю, какой столбец какого типа (код должен быть общим для всех таблиц)

Однако моя цель — экспортировать все как есть- в строках

То, что я пробовал (без успеха):

  1. df.applymap(str)
  2. read_sql_query(coerce_float=False)
  3. df.fillna('')
  4. 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)
 

Этот шаг занимает значительное время для обработки, однако решает мою проблему