Python支持多索引检查索引值

Python支持多索引检查索引值,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我试图比较两个数据帧的差异,使用一个公共键/索引值,该值由帧中的3列组成 e、 g。 假设两列中的列都是: “COL1”、“COL2”、“COL3”、“COL4” 数据帧是df1和df2,使用“读取csv”方法获取 然后我在这两个方面都使用了set_index方法: df1.set_index(["COL1","COL2","COL3"],inplace=True); df1.sort_index(inplace=True) df2.set_index(["COL1","COL2","COL3

我试图比较两个数据帧的差异,使用一个公共键/索引值,该值由帧中的3列组成

e、 g。 假设两列中的列都是: “COL1”、“COL2”、“COL3”、“COL4”

数据帧是df1和df2,使用“读取csv”方法获取

然后我在这两个方面都使用了set_index方法:

df1.set_index(["COL1","COL2","COL3"],inplace=True);
df1.sort_index(inplace=True)

df2.set_index(["COL1","COL2","COL3"],inplace=True);
df2.sort_index(inplace=True)
然后我想遍历df1数据帧,并检查df2数据帧是否有匹配的索引。 我尝试过使用以下方法:

for idx, df_select in df1.groupby(level=[0,1,2]):
    boolDf = df2.isin(idx).all();
但是它返回false(尽管我可以通过打印看到两者的索引都存在)

我做错了什么

另外,如何使用第一个数据帧的索引从第二个数据帧获取“loc”行

提前谢谢

编辑: 示例数据

testData1.csv包含: TESTVAL1、TESTVAL2、TESTVAL3、firstCsvVal

testData2.csv包含: TESTVAL1、TESTVAL2、TESTVAL3、Second CSVVAL

代码:

结果:

                                   COL4
COL1     COL2     COL3
TESTVAL1 TESTVAL2 TESTVAL3  firstCsvVal
                                    COL4
COL1     COL2     COL3
TESTVAL1 TESTVAL2 TESTVAL3  secondCsvVal
('TESTVAL1', 'TESTVAL2', 'TESTVAL3') COL4    False
dtype: bool

如果要通过比较列
“COL1”、“COL2”、“COL3”
来查找位于
df1
但不在
df2
中的行,可以执行以下操作

左连接
df1和df2
查找具有
NaN
查找
df1和df2中的行

您的数据帧大小是否相同?你能提供df1和df2的样本数据吗?谢谢@PrinceFrancis,我已经用一些样本数据和测试代码更新了我的问题。这足以澄清这一点吗?(再次感谢)您能提供testData1.csv和testData2.csv吗?它们的内容实际上是我在帖子中包含的每个文件的一行(行->“testData1.csv包含:”),谢谢,但我想比较两个数据帧值。i、 e.如果“COL1”、“COL2”和“COL3”作为索引在两者中匹配,那么比较“COL4”中保存的数据。我刚刚意识到,“合并”选项可能会满足我的需要,谢谢!(我忘记了合并后的同名列在第一列和第二列的后缀是“_x”或“_y”。因此,我可以将这两个列合并在一起,迭代行,然后比较“COL4_x”和“COL4_y”:
                                   COL4
COL1     COL2     COL3
TESTVAL1 TESTVAL2 TESTVAL3  firstCsvVal
                                    COL4
COL1     COL2     COL3
TESTVAL1 TESTVAL2 TESTVAL3  secondCsvVal
('TESTVAL1', 'TESTVAL2', 'TESTVAL3') COL4    False
dtype: bool
df3 = df1.merge(df2, how='left', on=["COL1","COL2","COL3"])
df3[df3.isnull().any(1)]
df3.dropna()