Python Pandas 根据另一个集合(集合)的成员资格选择行
Posted
技术标签:
【中文标题】Python Pandas 根据另一个集合(集合)的成员资格选择行【英文标题】:Python Pandas select rows based on membership of another collection (set) 【发布时间】:2017-01-29 21:29:43 【问题描述】:假设我有一个DataFrame
,构造如下:
import pandas
import numpy
column_names = ["name", "age", "score"]
names = numpy.random.choice(["Jorge", "Xavier", "Joaquin", "Juan", "Jose"], 50)
ages = numpy.random.randint(0, 100, 50)
scores = numpy.random.rand(50)
df = pandas.DataFrame.from_dict(dict(zip(column_names, [names, ages, scores])))
上面DataFrame
的前10行如下所示。
age name score
0 15 Jorge 0.031380
1 44 Juan 0.373199
2 84 Xavier 0.999065
3 55 Juan 0.159873
4 55 Joaquin 0.211931
5 33 Juan 0.484350
6 22 Xavier 0.510276
7 86 Joaquin 0.490013
8 2 Jose 0.185086
9 51 Juan 0.979015
我希望能够选择name
列的元素是"Xavier", "Joaquin"
成员的行。我本能地在想df.iloc[df["name"] in "Xavier", "Joaquin", :]
之类的东西,但这不起作用。那么我该如何实现呢?
注意
我知道我可以通过
来实现这个特定的例子df.loc[numpy.logical_or(df["name"] == "Xavier", df["name"] == "Joaquin"), :]
但这不是重点。这只是我真正问题的一个简化示例。我有一个高度为 2,340,923 的 DataFrame
和一个大小为 3,624 的名称集 names
,我想选择名称是名称集 names
成员的行。
【问题讨论】:
【参考方案1】:我觉得你需要isin
:
print (df.loc[df["name"].isin(["Xavier", "Joaquin"]), :])
age name score
1 66 Joaquin 0.767056
2 17 Joaquin 0.721369
7 53 Joaquin 0.209415
10 9 Xavier 0.394815
13 20 Joaquin 0.276596
14 17 Xavier 0.810725
15 76 Xavier 0.918273
17 91 Joaquin 0.974723
18 39 Xavier 0.869607
21 3 Xavier 0.200578
22 34 Joaquin 0.938018
23 90 Xavier 0.664387
26 51 Xavier 0.946753
28 49 Xavier 0.859911
30 22 Joaquin 0.602381
34 7 Xavier 0.759837
35 96 Joaquin 0.790691
39 13 Joaquin 0.599557
40 10 Xavier 0.563933
41 69 Xavier 0.983787
43 58 Xavier 0.542903
44 8 Joaquin 0.307106
45 77 Joaquin 0.330278
46 55 Joaquin 0.980077
47 12 Xavier 0.177509
49 15 Joaquin 0.590958
它也适用于set
nice:
names = set(["Xavier", "Joaquin"])
print (df.loc[df["name"].isin(names), :])
age name score
1 66 Joaquin 0.767056
2 17 Joaquin 0.721369
7 53 Joaquin 0.209415
10 9 Xavier 0.394815
13 20 Joaquin 0.276596
14 17 Xavier 0.810725
15 76 Xavier 0.918273
17 91 Joaquin 0.974723
18 39 Xavier 0.869607
21 3 Xavier 0.200578
22 34 Joaquin 0.938018
23 90 Xavier 0.664387
26 51 Xavier 0.946753
28 49 Xavier 0.859911
30 22 Joaquin 0.602381
34 7 Xavier 0.759837
35 96 Joaquin 0.790691
39 13 Joaquin 0.599557
40 10 Xavier 0.563933
41 69 Xavier 0.983787
43 58 Xavier 0.542903
44 8 Joaquin 0.307106
45 77 Joaquin 0.330278
46 55 Joaquin 0.980077
47 12 Xavier 0.177509
49 15 Joaquin 0.590958
【讨论】:
啊,当然!我隐约记得isin()
在我无用的大脑的最深处,但我认为这是一个 Numpy 概念,并试图搜索numpy.isin()
无济于事,因此我很困惑。谢谢。
很高兴能帮到你!以上是关于Python Pandas 根据另一个集合(集合)的成员资格选择行的主要内容,如果未能解决你的问题,请参考以下文章
Lambda 表达式 - 根据集合中另一个属性的值设置对象集合中一个属性的值
59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()
Python中pandas检查dataframe中是否包含某个字段或者数据列实战检查dataframe中是否包含某个字段集合