基于另一个集合(set)成员资格选择Python Pandas行

3
假设我有一个按照以下方式构建的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,我想选择其名称为 name 集合 names 成员的行。

1个回答

6

我认为你需要使用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一起使用:

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(),结果没有找到,把自己搞得很困惑。谢谢。 - Ray
很高兴能帮助你! - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接