2017-10-05 1 views
1

모든 레코드에서 동일한 레코드가 동일한 지 확인하려면 두 데이터 소스를 비교해야합니다. 하나의 데이터 소스는 Excel 파일에서 가져 오며 다른 하나는 SQL 테이블에서 가져옵니다. 나는 과거에 사용했던 것처럼 DataFrame.equals()을 사용해 보았습니다.Pandas read_sql DataTypes

그러나이 문제는 성가신 데이터 유형 문제로 인한 것입니다. 데이터가과 같다고하더라도 데이터 유형은 excel_df.loc[excel_df['ID'] = 1].equals(sql_df.loc[sql_df['ID'] = 1])으로 돌아오고 False이됩니다. pd.read_sql에서

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

같은 열 : 내가 SQL에 맞게 pd.read_excel()에서 converters 인수를 사용하여 시도 할 수

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

여기 pd.read_excel()에서 데이터 유형의 예입니다. 또는 또한 df['Column_Name] = df['Column_Name].astype(dtype_here)하고 있지만 나는 많은 열을 다루고있다. 모든 열에서 값을 확인하는 더 쉬운 방법이 있습니까? 팬더가 할 수있는 것을 의미한다 "개체"DTYPE 당신이 표시되는 경우 방법에 대한

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) 

답변

1

: pd.read_sql()을 확인

converters 같은 어떤 일이 없다하지만 내가 좋아하는 뭔가를 찾고 있어요 일부 행을 날짜로 해석하지 않고 대신 전체 열을 Object (기본적으로 문자열)로 캐스팅합니다.

문서를 보면 r dtypes, 변환기 및 parse_dates 인수 : https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

dayfirst 인수를 검사하여 날짜를 올바르게 구문 분석 할 수도 있습니다.

+0

나는 이것이 효과가 있었으면 좋겠다. 'TypeError : 데이터 유형을 이해하지 못했습니다. ' – MattR

+0

이 대답은 나를 반 (半) 사용 가능한 답으로 이끌었습니다. 나는 루프를 만들었고 이것은'TypeError'를 반환하지 않습니다. 그러나 일부 데이터 유형 (날짜와 우편 번호는'int '로 읽히는'str')과 같이 변경해야했습니다. 답변을 업데이트하고 싶다면 커뮤니티에 동의 할 수 있습니다. df1.columns.tolist()의 열에 대해 : df1 [열] = df1 [열] .astype (sql_df [열] .dtype)'올바른 들여 쓰기를 사용해야합니다. – MattR

+0

@Matt, 어떤 팬더 버전을 사용하고 있습니까? –

-1

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