2015-11-05 3 views
0

У меня есть локальная база данных Postgres, которую мне нужно загрузить на S3, а затем скопировать в Redshift.Pandas Чтение SQL в CSV-Int-преобразование

Для этого я использую Python панда следующим образом:

engine = create_engine(self.engine) 
connection = engine.raw_connection() 
df = pd.read_sql(<sql string>, connection, coerce_float=False) 
df.to_csv(<output fn>, header=True, index=False, encoding='utf-8') 

SQL, что он выполняет возвращает строку varchar(255), varchar(255), int, int. Однако, поскольку некоторые из этих значений могут быть нулевыми, я запускаю Pandas Caveat about integers and NaN values.

This post решает проблему, устанавливая na произвольным int и астерически явно как int. Они могут это сделать, потому что все их столбцы имеют один и тот же тип данных. Однако у меня есть сочетание varchar (255) и int.

Как я могу заставить df.to_csv(...) вывести мои ints как int (а не плавает)?

Спасибо,

ответ

0

Почему вы не можете вставить эти две строки выше df.to_csv()?

df = df.fillna(<some_int>) 
df[[int_col1, int_col2]] = df[[int_col1, int_col2]].astype('int64') 
+0

Я хочу, чтобы nulls оставались нулями. Я не хочу, чтобы они были произвольными. Если это так, копия Redshift вставляет произвольное значение int в качестве значения этой записи. – dlstadther

+0

Что такое нулевой идентификатор Redshift? Если это похоже на «\ N» в SQL, вы можете преобразовать столбец в varchar и заменить все нулевые значения на «\\ N» ... – Kartik

+0

Команда копирования Redshift позволяет использовать BLANKASNULL и EMPTYASNULL. Поля в красном смещении не могут изменить их тип данных. Скорее, вы должны создать новый столбец нужного типа данных, а затем выполнить обновление

= null где = <произвольный char>; '. Это может сработать, но мне бы хотелось, чтобы это было менее привлекательное решение, если оно существует. Однако, спасибо! Если в ближайшие дни ничего лучше не появится, я реализую это и отмечаю как решение. – dlstadther

Смежные вопросы