2015-11-05 69 views
0

我有數據需要上傳到S3然後複製到Redshift的本地Postgres數據庫。熊貓讀取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') 

,它執行的varchar(255), varchar(255), int, int返回行的SQL。但是,由於其中一些值可能爲空,所以我遇到了Pandas Caveat about integers and NaN values

This post通過將na設置爲任意int並將astype顯式設置爲int來解決它們的問題。他們能夠這樣做是因爲它們的所有列都具有相同的數據類型。但是,我有一個varchar(255)和int的混合。

我該如何強制df.to_csv(...)輸出我的整數作爲整數(而不是浮點數)?

感謝,

回答

0

你爲什麼不能插入這些上面兩行df.to_csv()

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

我希望空位保持空位。我不希望他們成爲一個任意的int。如果是這樣,Redshift的副本將插入任意的int作爲該記錄的字段值。 – dlstadther

+0

什麼是Redshift的空標識符?如果它與SQL中的'\ N'類似,則可以將列轉換爲varchar,並用'\\ N'替換所有空值... – Kartik

+0

Redshift複製命令允許使用BLANKASNULL和EMPTYASNULL。 redshift中的字段不能更改其數據類型。相反,你必須創建一個你想要的數據類型的新列,然後執行'更新

集合 = null,其中 = <任意字符>;'。這可以工作,但如果存在的話,我真的很喜歡較少涉及的解決方案。謝謝你!如果在接下來的幾天內沒有其他更好的東西出現,我會執行此操作並標記爲解決方案。 – dlstadther