当前位置: 首页 > 面试题库 >

熊猫:通过多列查找另一个DataFrame中不存在的行

赵嘉赐
2023-03-14
问题内容

与此python
pandas一样:如何在一个数据框中找到行,而在另一个数据框中却找不到?
但是有多列

这是设置:

import pandas as pd

df = pd.DataFrame(dict(
    col1=[0,1,1,2],
    col2=['a','b','c','b'],
    extra_col=['this','is','just','something']
))

other = pd.DataFrame(dict(
    col1=[1,2],
    col2=['b','c']
))

现在,我要选择其他行中df不存在的行。我想通过col1和进行选择col2

在SQL中,我会做:

select * from df 
where not exists (
    select * from other o 
    where df.col1 = o.col1 and 
    df.col2 = o.col2
)

在熊猫里,我可以做这样的事情,但是感觉很丑。如果df具有id列,则可以避免部分丑陋的情况,但并非总是如此。

key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)

desired_result =  df_with_idx[~mask].drop('index',axis=1)

因此,也许有一些更优雅的方法?


问题答案:

由于0.17.0有一个新的indicator参数,您可以传递给merge它,以告诉您行是仅出现在左侧,右侧还是同时出现在两个行中:

In [5]:
merged = df.merge(other, how='left', indicator=True)
merged

Out[5]:
   col1 col2  extra_col     _merge
0     0    a       this  left_only
1     1    b         is       both
2     1    c       just  left_only
3     2    b  something  left_only

In [6]:    
merged[merged['_merge']=='left_only']

Out[6]:
   col1 col2  extra_col     _merge
0     0    a       this  left_only
2     1    c       just  left_only
3     2    b  something  left_only

因此,您现在可以通过仅选择'left_only'行来过滤合并的df



 类似资料:
  • 我有两个Pandas Dataframe和,其中是的一部分,我想创建一个Dataframe,其中包含中的code>。 以下是一个例子: 注: 我的DataFrame可能有多个列,但是必须仅在列上进行匹配。

  • 问题内容: 我有两个Series,并且索引相同(非连续)。如何合并并成为DataFrame中的两列,并将其中一个索引保留为第三列? 问题答案: 我认为这是个不错的方法。如果存在它们,则使用“系列”的名称属性作为列(否则,将它们简单地编号): 注意:这扩展到2个以上的系列。

  • 问题内容: 我有两个表TABLE1看起来像: w / c的TABLE2看起来像: 我想通过比较来获得非现有名称与。 所以基本上,我必须获得第二行,w / c具有NN名称,该名称在中不存在,输出应如下所示: 我已经尝试过了,但是没有用: 并且仍在获取现有记录。 问题答案: 在这里没有帮助。 解决此问题的一种方法是使用:

  • 问题内容: 我有一个熊猫,其中有多个列: 其中和是包含相同数据但名称不同的列。有没有一种方法可以将组成行的行移动到理想状态,同时保持名称? 最后,DataFrame应该显示为: 那就是构成bar的NaN值被替换为的值。 问题答案: 尝试这个: 如果您希望该数据成为新列,只需将结果分配给即可。

  • 问题内容: 以下面的DataFrame为例, 生成一个新列的简单方法是什么?该列包含某一列中的某些数据聚集? 例如,如果我总结了 我怎样才能得到 问题答案:

  • 问题内容: 我在df中有几列相同的名称。需要重命名它们。无论如何,通常的重命名都会重命名,我可以将下面的blah重命名为blah1,blah4,blah5吗? 在[7]中: 问题答案: 我希望在Pandas中找到比通用Python解决方案更多的解决方案。如果Column的get_loc()函数找到带有“ True”值的重复项,则该掩码数组将返回掩码数组,“ True”值指向找到重复项的位置。然后,