我有两个数据框:
df1:
A B C
1 ss 123
2 sv 234
3 sc 333
df2:
A dd xc
1 ss 123
df2将始终只有一行。如何检查df1中该行df2是否匹配?
答案 0 :(得分:4)
对参数为axis=1
的{{3}}使用Numpy比较:
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['ss', 'sv', 'sc'], 'C': [123, 234, 333]})
df2 = pd.DataFrame({'A': [1], 'dd': ['ss'], 'xc': [123]})
df3 = df1.loc[np.all(df1.values == df2.values, axis=1),:]
或者:
df3 = df1.loc[np.all(df1[['B','C']].values == df2[['dd','xc']].values, axis=1),:]
print(df3)
A B C
0 1 ss 123
答案 1 :(得分:0)
Sandeep的答案之外,还可以执行以下操作:
df1[np.all(df1.values == df2.values,1)].any().any()
用于获取布尔值。
或者另一种方式:
df1[(df2.values==df1.values).all(1)].any().any()
或者:
pd.merge(df1,df2).equals(df1)
注意:两者都输出True
检查特定列(与Sandeep相同):
df1[col].isin(df2[col]).any()
答案 2 :(得分:0)
如何检查df1中该行df2是否匹配?
您可以对齐列,然后检查df1
与df2
的唯一行是否相等:
df2.columns = df1.columns
res = (df1 == df2.iloc[0]).all(1).any() # True
此解决方案的好处是您不必对df1
进行子集设置(昂贵),而是构造一个布尔数据帧/数组(便宜)并检查至少一行中的所有值是否为True
这并不是特别有效,因为您正在考虑df1
中的每行,而不是在满足条件时停止。特别是对于数字数据,有更有效的解决方案。