2017-10-05 217 views
1

我必須比較兩個數據源,以查看所有行中的相同記錄是否相同。一個數據源來自Excel文件,另一個來自SQL表。我試過使用DataFrame.equals()就像我過去一樣。熊貓read_sql數據類型

但是,這個問題是由於討厭的數據類型問題。即使數據看起來相同,數據類型也使excel_df.loc[excel_df['ID'] = 1].equals(sql_df.loc[sql_df['ID'] = 1])返回False。下面是從pd.read_excel()數據類型的例子:

COLUMN ID       int64 
ANOTHER Id      float64 
SOME Date    datetime64[ns] 
Another Date    datetime64[ns] 

pd.read_sql相同的列:

COLUMN ID      float64 
ANOTHER Id      float64 
SOME Date       object 
Another Date      object 

我可以嘗試使用converters參數從pd.read_excel()匹配SQL。或者也在做df['Column_Name] = df['Column_Name].astype(dtype_here)但我正在處理很多列。是否有更簡單的方法來檢查所有列的值?

檢查pd.read_sql()有像converters沒有的事情,但我在尋找類似:

df = pd.read_sql("Select * From Foo", con, dtypes = ({Column_name: str, 
                 Column_name2:int})) 

回答

1

如何

excel_df = pd.read_excel(...) 
sql_df = pd.read_sql(...) 

# attempt to cast all columns of excel_df to the types of sql_df 
excel_df.astype(sql_df.dtypes.to_dict()).equals(sql_df) 
+0

我希望這會奏效。我得到了'TypeError:數據類型不理解' – MattR

+0

這個答案確實使我成爲一個半可用的答案。我創建了一個循環,這不會返回'TypeError'。然而,我確實需要改變一些數據類型(比如日期和郵政編碼爲'str',這些數據類型被讀爲'int')。如果你想更新你的答案,我可以接受它爲社區。這裏是我發現的:'用於df1.columns.tolist()中的列: df1 [column] = df1 [column] .astype(sql_df [column] .dtype)'必須使用適當的縮進。 – MattR

+0

@Matt,你使用的是熊貓版本? –