2017-11-28 1 views
0

원본 팬더 데이터 프레임이있는 경우 df이라고합시다. 데이터 프레임을 CSV 파일로 변환 한 다음 팬더 데이터 프레임으로 다시 변환합니다. df.equals (새 데이터 프레임)를 호출하면 false를 반환합니다. 한 가지 오류로 인해 색인 생성이 중단 될 수 있다고 생각했기 때문에 새로운 데이터 프레임의 색인을 원본 데이터 프레임의 색인 인 CSV 파일의 첫 번째 열로 설정했지만 여전히 동일한 결과를 얻었습니다.데이터 프레임을 CSV로 변환하고 데이터 프레임으로 돌아온 후 false를 반환하는 pd.equals()

예제 코드 : 나는 그래서 나는 그들이 동일한 것으로 나타나 다시 CSV로 DF2를 변환하여이 CSV를을 (FILE_NAME 및 df2.to_csv()에서 만든 CSV)를 비교하여 몇 가지 수동 테스트를, '않았다

import pandas as pd 

df = <stuff here that aggregates other dataframes into one> 
file_name = 'test/aggregated_reports.csv' 
df.to_csv(file_name) 
df2 = pd.read_csv(file_name, index_col=0) 
assert df.equals(df2) 

원래 데이터 프레임을 CSV 파일로 변환 할 때 "차이"가 발생한다고 가정합니다. 그러나 나는 여전히 그것을 이해할 수 없다 ...

"차이"를 일으키는 원인이 될 수있는 것에 대한 통찰력은 크게 감사하겠습니다!

답변

0

이것은 반올림 오류 일 수 있습니다. 데이터가 숫자라고 가정합니다. 실수로 부동 소수점 숫자를 텍스트로 저장하는 경우이를 다시 읽으면 약간의 오류가 발생하는 경향이 있습니다. 아래 참조 - .equals()가 아닌 차이를 사용하여 숫자 데이터를 비교해보십시오.

import pandas as pd 
import numpy as np 

df = pd.DataFrame(
    columns=['a', 'b', 'c'], 
    index=[0, 1, 2, 3] * 3, 
    data=np.random.random((12, 3))) 

file_name = 'mydata.csv' 
df.to_csv(file_name) 
df2 = pd.read_csv(file_name, index_col=0) 

print(df.equals(df2))       # Returns False 
print(np.all(np.abs((df - df2) < 10 ** -10))) # Returns True 

몇 가지 다른 옵션은보고 :

compare = (df == df2)  # Dataframe of True/False 
compare.all()    # By column, True if all values are equal 
compare.count()   # By column, how many values are equal 

# Return any rows where there was a difference 
df.where(~compare).dropna(how='all') 
+0

아도 수레 생각하지 않았다, 좋은 지적입니다. 내 데이터 프레임은 실제로 문자열과 숫자가 혼합 된 보고서이므로 df - df2가 작동하지 않습니다. 잠재적 플로트 반올림 오류를 고려한 해결 방법이 있습니까? – Louis

+0

이것이 나의 질문을 더 명확하게 정의한다면, 나의 데이터 프레임은 문자열, 숫자, 빈 (non)이 혼합되어있다. – Louis

+0

오, 나는 문자열을 무시할 수있는 방법이 있는지 잘 모르겠습니다. 시도해 볼 수 있습니다 (df == df2). 어느 것이 다른지를 나타내는 True/False 값의 데이터 프레임을 반환합니다. 열에서 작동하는 .all() 또는 .count()를 사용하여이를 집계하면 문제가있는 곳을 좁힐 수 있습니다. –