使用值列表从 Pandas 数据框中选择行
Posted
技术标签:
【中文标题】使用值列表从 Pandas 数据框中选择行【英文标题】:Use a list of values to select rows from a Pandas dataframe 【发布时间】: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
【问题讨论】:
【参考方案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/…。选择后需要排序。
这对我有帮助 ***.com/a/29108799/5629831
你也可以通过使用'query'和@以上是关于使用值列表从 Pandas 数据框中选择行的主要内容,如果未能解决你的问题,请参考以下文章