【问题标题】:python pandas: how to find rows in one dataframe but not in another?python pandas:如何在一个数据框中找到行,但在另一个数据框中找不到?
【发布时间】:2015-09-18 12:17:09
【问题描述】:

假设我有两个表:people_allpeople_usa,它们具有相同的结构,因此具有相同的主键。

如何获取不在美国的人员的表格? 在 SQL 中,我会执行以下操作:

select a.*
from people_all a

left outer join people_usa u
on a.id = u.id

where u.id is null

Python 的等价物是什么?我想不出办法将这个 where 语句翻译成 pandas 语法。

我能想到的唯一方法是向 people_usa 添加一个任意字段(例如people_usa['dummy']=1),进行左连接,然后只获取“dummy”为 nan 的记录,然后删除虚拟字段 - 这似乎有点绕。

谢谢!

【问题讨论】:

  • people_all_set.difference(people_usa_set) 能解决问题吗?
  • 这仅适用于数据框的索引吗?我想要指定将其应用于的字段的选项

标签: python pandas dataframe


【解决方案1】:

使用isin 并否定布尔掩码:

people_usa[~people_usa['ID'].isin(people_all ['ID'])]

例子:

In [364]:
people_all = pd.DataFrame({ 'ID' : np.arange(5)})
people_usa = pd.DataFrame({ 'ID' : [3,4,6,7,100]})
people_usa[~people_usa['ID'].isin(people_all['ID'])]

Out[364]:
    ID
2    6
3    7
4  100

所以从结果中删除了 3 和 4,布尔掩码如下所示:

In [366]:
people_usa['ID'].isin(people_all['ID'])

Out[366]:
0     True
1     True
2    False
3    False
4    False
Name: ID, dtype: bool

使用~ 反转掩码

【讨论】:

  • 如果您有多个列要检查/加入,有没有简单的方法可以做到这一点?
  • 您可以执行 merge 然后消除合并 df 中存在的行,否则您必须为要比较的所有列建立一个布尔条件,但大概是在检查多个列时您说的是这些列是唯一的列,对吗?例如,如果说 col1 和 col2 匹配但 col3 不匹配,则它不匹配
  • 是的,我一直在做合并,但感觉很麻烦。 ...我的意思是select * from A where not exists (select * from B where A.col1 = B.col1 and A.col2 = B.col2) 我觉得这句话在熊猫中是不可能优雅地做到的:(
  • @Pekka:你可以使用mask = people_all[primary_key].isin(people_usa[primary_key]).all(axis=1)。然后选择带有people_nonusa = people_all.loc[~mask] 的非美国人。
  • @Pekka 我同意 unutbu 的观点,因为您不必在单行中做所有事情,并且可以拆分语句以使其更具可读性
【解决方案2】:

这里还有一个类似于 SQL Pandas 的方法:.query():

people_all.query('ID not in @people_usa.ID')

或使用 NumPy 的 in1d() 方法:

people_all.[~np.in1d(people_all, people_usa)]

注意:对于那些有 SQL 经验的人,可能值得阅读Pandas comparison with SQL

【讨论】:

    【解决方案3】:

    我会组合(通过堆叠)数据帧,然后执行 .drop_duplicates 方法。在此处找到文档:

    http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.drop_duplicates.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      相关资源
      最近更新 更多