【问题标题】:Use a list of values to select rows from a Pandas dataframe使用值列表从 Pandas 数据框中选择行
【发布时间】:2020-06-09 04:58:19
【问题描述】:

假设我有以下 Pandas 数据框:

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

我可以根据特定值进行子集化:

x = df[df['A'] == 3]
x

     A   B
2    3   3

但是如何根据值列表进行子集化? - 像这样:

list_of_values = [3,6]

y = df[df['A'] in list_of_values]

获得:

     A    B
1    6    2
2    3    3

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    可以使用query的方法:

    df.query('A in [6, 3]')
    # df.query('A == [6, 3]')
    

    lst = [6, 3]
    df.query('A in @lst')
    # df.query('A == @lst')
    

    【讨论】:

    • 我想知道 query() 在计算上是否比 isin() 函数更好
    • @Hammad 根据 Pandas 文档:“对于大帧,使用 numexpr 的 DataFrame.query() 比 Python 稍快。”
    • 如何组合两个查询? df.query('A in @lst') AND df.query('B in @lst2')
    • @data_runner df.query('(A in @lst) and (B in @lst2)')
    【解决方案2】:

    另一种方法;

    df.loc[df.apply(lambda x: x.A in [3,6], axis=1)]
    

    isin 方法不同,这在确定列表是否包含A 列的函数时特别有用。比如f(A) = 2*A - 5作为函数;

    df.loc[df.apply(lambda x: 2*x.A-5 in [3,6], axis=1)]
    

    需要注意的是,这种方法比isin方法慢。

    【讨论】:

    • df.loc[df.apply(lambda x: ... 的使用非常强大。为我做了诀窍。是的,它更慢但更灵活:)
    【解决方案3】:

    您可以使用isin 方法:

    In [1]: df = pd.DataFrame({'A': [5,6,3,4], 'B': [1,2,3,5]})
    
    In [2]: df
    Out[2]:
       A  B
    0  5  1
    1  6  2
    2  3  3
    3  4  5
    
    In [3]: df[df['A'].isin([3, 6])]
    Out[3]:
       A  B
    1  6  2
    2  3  3
    

    反之则使用~:

    In [4]: df[~df['A'].isin([3, 6])]
    Out[4]:
       A  B
    0  5  1
    3  4  5
    

    【讨论】:

    • 如何按列表的顺序返回这些值?例如,list_of_values 的值先是 3,然后是 6,但返回的帧是先是 6,然后是 3。我说的不是简单的排序,而是我们如何具体地按照列表中值的顺序返回。
    • 这是一个布尔索引的示例,它使订单远离索引,有关更多详细信息,请参阅pandas.pydata.org/pandas-docs/stable/…。选择后需要排序。
    • 你也可以通过使用'query'和@来获得类似的结果:例如:df = pd.DataFrame({'A': [1, 2, 3], ' B': ['a', 'b', 'f']}) df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]}) list_of_values = [3,6] result= df.query("A in @list_of_values") 结果 AB 1 6 2 2 3 3
    • @JasonStrimpel 我在这里回答了你的问题:stackoverflow.com/questions/51944021/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多