给定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操作可能是相关的。
由于在您的实际用例中,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)
您可以使用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()检查来避免嵌套。