2017-11-28 13 views
0

オリジナルのパンダデータフレームがあります。dfとしましょう。私はcsvファイルにデータフレームを変換し、それを元にpandasデータフレームに変換します。 df.equals(新しいデータフレーム)を呼び出すと、falseを返します。 1つのエラーがインデックス作成がオフになる可能性があるため、新しいデータフレームのインデックスをcsvファイルの最初の列(元のデータフレームのインデックス)に設定しましたが、同じ結果が得られました。データフレームをCSVに変換してデータフレームに戻した後にfalseを返すpd.equals()

例コード:

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) 

Iが再びCSVにDF2を変換し2つのCSV(FILE_NAMEとdf2.to_csv()から作成したCSV)を比較することによって、いくつかの手動テストを行なったし、それらが同一であるように見えたので、私は」元のデータフレームを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

これが私の質問をより明確にするならば、私のデータフレームには文字列、数字、空(空)が混在しています。 – Louis

+0

ああ、文字列を無視する方法があるかどうかはわかりません。あなたは(df == df2)を試みることができます。これは真偽値のデータフレームを返します。列に作用する.all()または.count()で集計すると、問題のある箇所が絞り込まれます。 –

関連する問題