比较两个具有不同列名的熊猫数据框并找到匹配项

时间:2018-11-14 09:47:08

标签: python pandas dataframe

我有两个数据框:

df1:

A    B    C
1    ss   123
2    sv   234
3    sc   333

df2:

A    dd   xc
1    ss   123

df2将始终只有一行。如何检查df1中该行df2是否匹配?

3 个答案:

答案 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是否匹配?

您可以对齐列,然后检查df1df2的唯一行是否相等:

df2.columns = df1.columns

res = (df1 == df2.iloc[0]).all(1).any()  # True

此解决方案的好处是您不必对df1进行子集设置(昂贵),而是构造一个布尔数据帧/数组(便宜)并检查至少一行中的所有值是否为True

这并不是特别有效,因为您正在考虑df1中的行,而不是在满足条件时停止。特别是对于数字数据,有更有效的解决方案。