我正在尝试使用由帧中的3列组成的公共键/索引值比较两个DataFrame的差异。
例如 假设两个列均是: “ COL1”,“ COL2”,“ COL3”,“ COL4”
数据帧是df1和df2,使用“ read_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 dataFrame并检查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,secondCsvVal
代码:
import pandas as pd
firstFile = "P:\\Documents\\Python\\testData1.csv"
secondFile = "P:\\Documents\\Python\\testData2.csv"
columnNames =["COL1","COL2","COL3","COL4"]
firstData = pd.read_csv(firstFile,names=columnNames)
secondData = pd.read_csv(secondFile,names=columnNames)
firstData.set_index(["COL1","COL2","COL3"],inplace=True)
firstData.sort_index(inplace=True)
secondData.set_index(["COL1","COL2","COL3"],inplace=True)
secondData.sort_index(inplace=True)
print(firstData)
print(secondData)
for idx, df_select in firstData.groupby(level=[0,1,2]):
boolDf = secondData.isin(idx).all()
print(idx,boolDf)
结果:
COL4
COL1 COL2 COL3
TESTVAL1 TESTVAL2 TESTVAL3 firstCsvVal
COL4
COL1 COL2 COL3
TESTVAL1 TESTVAL2 TESTVAL3 secondCsvVal
('TESTVAL1', 'TESTVAL2', 'TESTVAL3') COL4 False
dtype: bool
答案 0 :(得分:0)
如果您打算通过比较列df1
来查找df2
中而不是"COL1","COL2","COL3"
中的行,则可以执行以下操作
df1 and df2
df3 = df1.merge(df2, how='left', on=["COL1","COL2","COL3"])
NaN
的行df3[df3.isnull().any(1)]
df1 and df2
中的行df3.dropna()