【问题标题】:Python Pandas select rows based on membership of another collection (set)Python Pandas 根据另一个集合(集合)的成员资格选择行
【发布时间】: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 成员的行。

【问题讨论】:

    标签: python pandas indexing set conditional-statements


    【解决方案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() 无济于事,因此我很困惑。谢谢。
    • 很高兴能帮到你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多