当前位置: 首页 > 知识库问答 >
问题:

高效地选择与Pandas DataFrame[重复]中的多个值之一匹配的行

潘弘博
2023-03-14

给定Pandas DataFrame中的数据,如下所示:

Name     Amount
---------------
Alice       100
Bob          50
Charlie     200
Alice        30
Charlie      10

我想选择名称是集合中多个值之一的所有行{Alice,Bob}

Name     Amount
---------------
Alice       100
Bob          50
Alice        30

在熊猫中,什么是有效的方法?

我看到的选项

>

merge(df[df.name = specific_name] for specific_name in names) # something like this

执行某种联接

这里的性能权衡是什么?什么时候一种解决方案比其他解决方案更好?我错过了什么解决方案?

虽然上面的示例使用字符串,但我的实际作业在数百万行上使用10-100个整数的匹配,因此快速NumPy操作可能是相关的。

共有2个答案

高英彦
2023-03-14

由于在您的实际用例中,df['Name']中的值是int,因此您可以使用NumPy索引而不是Series.isin更快地生成布尔掩码。

idx = np.zeros(N, dtype='bool')
idx[names] = True
df[idx[df['Name'].values]]

例如,给定此设置:

import pandas as pd
import numpy as np

N = 100000
df = pd.DataFrame(np.random.randint(N, size=(10**6, 2)), columns=['Name', 'Amount'])
names = np.random.choice(np.arange(N), size=100, replace=False)
In [81]: %timeit idx = np.zeros(N, dtype='bool'); idx[names] = True; df[idx[df['Name'].values]]
100 loops, best of 3: 9.88 ms per loop

In [82]: %timeit df[df.Name.isin(names)]
10 loops, best of 3: 107 ms per loop

In [83]: 107/9.88
Out[83]: 10.82995951417004

N是(本质上)df['Names]可以达到的最大值。如果N较小,则速度效益没有那么大。当N=200时,

In [93]: %timeit idx = np.zeros(N, dtype='bool'); idx[names] = True; df[idx[df['Name'].values]]
10 loops, best of 3: 62.6 ms per loop

In [94]: %timeit df[df.Name.isin(names)]
10 loops, best of 3: 178 ms per loop

In [95]: 178/62.6
Out[95]: 2.8434504792332267

注意:如上所示,似乎有速度优势,尤其是当N变得很大时。但是,如果N太大,则形成idx=np。零(N,dtype='bool')可能不可行。

卫生检查:

expected = df[df.Name.isin(names)]
idx = np.zeros(N, dtype='bool')
idx[names] = True
result = df[idx[df['Name'].values]]
assert expected.equals(result)
隗高旻
2023-03-14

您可以使用isin系列方法:

In [11]: df['Name'].isin(['Alice', 'Bob'])
Out[11]: 
0     True
1     True
2    False
3     True
4    False
Name: Name, dtype: bool

In [12]: df[df.Name.isin(['Alice', 'Bob'])]
Out[12]: 
    Name  Amount
0  Alice     100
1    Bob      50
3  Alice      30
 类似资料:
  • 问题内容: 问题 在Pandas DataFrame中给定数据,如下所示: 我想选择所有是集合中几个值之一的行 题 在Pandas中执行此操作的有效方法是什么? 我看到的选项 遍历行,使用Python处理逻辑 选择并合并许多语句,如下所示 执行某种联接 这里的性能折衷是什么?一种解决方案何时比另一种更好?我缺少什么解决方案? 尽管上面的示例使用字符串,但我的实际工作是使用数百万行中10-100个整

  • 我有一个表格结构 如何使用条件?我尝试使用这个,但结果是

  • 问题内容: 这似乎很基本,但我无法弄清楚。 我有一个表“ item_tags”,我想选择所有与标签1和2匹配的项目(例如,每个项目都必须同时具有两个标签)。 我将如何在mysql中执行此操作? 创建表是: 谢谢! 问题答案: 使用: 您需要定义GROUP BY和HAVING子句,并且不同标签ID的数量必须等于您在IN子句中指定的标签数。

  • 我想选择每个有明天日期时间的记录,不管一天中的什么时候。 然而,明天只指明天(午夜后)开始一天。这是一个时间点,不涵盖一整天。 所以我可以在我的查询中这样做? 但是什么 有什么想法吗?

  • 问题内容: 这是桌子:- 而下面是一个 虚构的 sql 预期的结果是:- (一种) (B) (C) 最喜欢’A’的情况! 我知道这种情况与组合有关。 在现实世界中-客户从商店获得商品,并且由于他与商店之间达成协议,他每个星期五都付款。例如,付款金额不是项目的确切总和:他得到5册50钪(= 250钪)的书,而星期五他带来了150册。所以前3本书非常匹配-3 * 50 = 150.我需要找到那三本书的

  • 我有一个可以包含多个可选ID的类,该类将选择第一个可用ID并将其返回给调用方。像下面这样。 我想使用像map和orElse这样的可选方法,但在这种情况下,它会导致太多的嵌套。另外两个伪代码选项可能是。 有没有比我现有的方法更好的方法?我很想通过做香草isPresent()检查来避免嵌套。