Python 如何使用已写入csv的数据帧测试相等性

Python 如何使用已写入csv的数据帧测试相等性,python,pandas,Python,Pandas,我对以下问题有异议: d1=pd.DataFrame([[1,2,3],[3,4,{}],[4,1,0]] d1.columns=pd.MultiIndex.from_元组([(1,1)、(1,2)、(2,3)]) d1.index=pd.MultiIndex.from_元组([(1,2)、(2,3)、(2,4)]) d1=d1.applymap(lambda l:np.nan如果l=={}else l) d1.至csv(“测试3452345.csv”) d2=pd.read\u csv(“./

我对以下问题有异议:

d1=pd.DataFrame([[1,2,3],[3,4,{}],[4,1,0]]
d1.columns=pd.MultiIndex.from_元组([(1,1)、(1,2)、(2,3)])
d1.index=pd.MultiIndex.from_元组([(1,2)、(2,3)、(2,4)])
d1=d1.applymap(lambda l:np.nan如果l=={}else l)
d1.至csv(“测试3452345.csv”)
d2=pd.read\u csv(“./testing3452345.csv”,索引列=[0,1],标题=[0,1])
d1.等于(d2)
这是
False
,尽管我希望这是
True

看看我掌握的数据:

#print(d1)
     1       2
     1  2    3
1 2  1  2  3.0
2 3  3  4  NaN
  4  4  1  0.0


#print(d2)
     1       2
     1  2    3
1 2  1  2  3.0
2 3  3  4  NaN
  4  4  1  0.0
我不确定,但我认为问题可能是,
np.nan
无法进行平等性测试,因此我:

pd.Series([np.nan])==pd.Series([np.nan])#这是错误的
这应该如何处理

我认为以下方法可能有效:

d1=pd.DataFrame([[1,2,3],[3,4,{}],[4,1,0]]
d1.columns=pd.MultiIndex.from_元组([(1,1)、(1,2)、(2,3)])
d1.index=pd.MultiIndex.from_元组([(1,2)、(2,3)、(2,4)])
d1=d1.applymap(lambda l:“测试_值”,如果l=={}else l)
d1.至csv(“测试3452345.csv”)
d2=pd.read\u csv(“./testing3452345.csv”,索引列=[0,1],标题=[0,1])
d1.等于(d2)
但这仍然返回false

转换成dicts我有:

#d1.to_dict()
{(1, 1): {(1, 2): 1, (2, 3): 3, (2, 4): 4},
 (1, 2): {(1, 2): 2, (2, 3): 4, (2, 4): 1},
 (2, 3): {(1, 2): 3, (2, 3): 'testing_value', (2, 4): 0}}



#d2.to_dict()
{('1', '1'): {(1, 2): 1, (2, 3): 3, (2, 4): 4},
 ('1', '2'): {(1, 2): 2, (2, 3): 4, (2, 4): 1},
 ('2', '3'): {(1, 2): '3', (2, 3): 'testing_value', (2, 4): '0'}}

因此,我不太确定,这可能与多重索引有关。

在您的
read\u csv
函数之后添加这一行应该有助于解决问题

d2.columns = d2.columns.set_levels([d2.columns.levels[1].astype(int), d2.columns.levels[1].astype(int)],level=[0,1])
原因是当从csv文件读取数据帧时,头被设置为字符串而不是整数。通过上面的这一行,我们将它们设置回整数


据我所知,没有更好的解决方案。

两个数据帧的列需要具有相同的数据类型。在查看已转换的数据帧(到字典)时,我看到
d2
中的一些值是字符串而不是整数,而不是
d1
。这可能是问题所在吗?@erikvande即使它们是相同的
.dtypes
,但在写入csv后,它们被读取为字符串,而不是混合。我不知道如何处理这个问题,但仍然没有相等的测试,所以我不认为我可以认为它是一个解决方案,谢谢TooDoad…我在本地机器上成功地测试了它,否则我不会把它作为解决方案发布。我现在确实看到它只适用于您的第一段代码,而不适用于您的第二段代码(您将np.nan更改为“testing_value”的代码)。我们将对此进行研究