Вопрос или проблема
Я пытаюсь загрузить данные из таблицы базы данных Oracle в DataFrame pandas в строковом формате, где моя таблица имеет много полей NUMBER с данными без десятичных знаков.
например, tableA (col1 varchar2(30), col2 number, col3 varchar2(12)…. col8 number, col9 number)
Загрузка данных из этой tableA в DataFrame pandas с помощью следующего кода и затем попытка конвертировать всё в строковый тип данных –
import connectorx as cx
import pandas as pd
sql_qry= “select col1,col2,…col9 from tableA”
df = cx.read_sql(, sql_qry, return_type=”pandas”)
df = df.convert_ctypes(infer_objects=False, convert_string=True)
df.to_csv(, header=True, sep=’|’, index=False, mode=”a”, encoding=’utf8′, quotechar=””)
Теперь в CSV файле значения col2 представлены как целые числа без десятичной точки, но все другие числовые значения столбцов имеют десятичную точку, тогда как в базе данных у них только целые числовые значения.
Таким образом, вывод выглядит следующим образом –
“col1″,”col2″,”col3″,………”col8″,”col9”
“John”,”12532″,”A56″…………….”210008.0″,”315.0″
“Sam”,”16435″,”B5F”,…………”384.0″,”315.0″
“Vipin”,”67453″,”BG4″,………..”4558.0″,”4675.0″
Только значения col2 приходят без десятичной части, и хотя col8 и col9 в базе данных имеют целые значения без десятичной части, в CSV они приходят с десятичной частью.
Есть ли способ получить эти числовые значения как есть из БД?
Попробовал следующее –
import connectorx as cx
import pandas as pd
sql_qry= “select col1,col2,…col9 from tableA”
df = cx.read_sql(, sql_qry, return_type=”pandas”)
df = df.convert_ctypes(infer_objects=False, convert_string=True)
df.to_csv(, header=True, sep=’|’, index=False, mode=”a”, encoding=’utf8′, quotechar=””)
Теперь в CSV файле значения col2 представлены как целые числа без десятичной точки, но все другие числовые значения столбцов имеют десятичную точку, тогда как в базе данных у них только целые числовые значения.
Таким образом, вывод выглядит следующим образом –
“col1″,”col2″,”col3″,………”col8″,”col9”
“John”,”12532″,”A56″…………….”210008.0″,”315.0″
“Sam”,”16435″,”B5F”,…………”384.0″,”315.0″
“Vipin”,”67453″,”BG4″,………..”4558.0″,”4675.0″
Ожидаемый результат следующий –
“col1″,”col2″,”col3″,………”col8″,”col9”
“John”,”12532″,”A56″…………….”210008″,”315″
“Sam”,”16435″,”B5F”,…………”384″,”315″
“Vipin”,”67453″,”BG4″,………..”4558″,”4675″
Ответ или решение
Чтобы решить вашу проблему с преобразованием числовых данных в строковый формат без десятичных знаков при извлечении данных из базы данных Oracle в DataFrame pandas, можно использовать несколько подходов. В вашем случае, я замечаю, что вы уже используете метод convert_dtypes
в pandas, однако он не приводит все числовые колонки к нужному вам формату.
Для достижения желаемого результата, можно воспользоваться методом astype
, например, после извлечения данных из базы данных. Давайте рассмотрим пример кода:
import connectorx as cx
import pandas as pd
# Шаг 1: Выполнение SQL-запроса для извлечения данных
sql_qry = "SELECT col1, col2, col3, col4, col5, col6, col7, col8, col9 FROM tableA"
df = cx.read_sql(sql_qry, return_type="pandas")
# Шаг 2: Определение необходимых колонок для преобразования
# Предполагаем, что col2, col8 и col9 - это колонки с числовыми значениями
numeric_cols = ['col2', 'col8', 'col9']
# Шаг 3: Преобразование числовых колонок в строки, убирая десятичные знаки
for col in numeric_cols:
df[col] = df[col].astype(int).astype(str)
# Шаг 4: Сохранение DataFrame в CSV-файл, с необходимыми параметрами
df.to_csv('output.csv', header=True, sep='|', index=False, mode='a', encoding='utf8', quotechar='"')
В данном коде происходит следующее:
- Мы извлекаем данные из базы данных и создаем DataFrame.
- Определяем список колонок, которые являются числовыми и нуждаются в преобразовании.
- Для каждой из указанных колонок мы сначала преобразуем её в целое число (что уберет десятичные знаки) и затем в строку.
- После завершения преобразований мы сохраняем DataFrame в CSV-файл с указанными параметрами.
В результате вы получите CSV-файл с нужным вам форматом:
"col1","col2","col3","col4","col5","col6","col7","col8","col9"
"John","12532","A56","...","...","...","...","210008","315"
"Sam","16435","B5F","...","...","...","...","384","315"
"Vipin","67453","BG4","...","...","...","...","4558","4675"
Этот подход должен помочь вам получить нужный результат, где все числовые значения будут представлены в строковом формате без десятичных знаков.