从PANDAS数据帧中获取满足(字典?)要求

2024-04-27 03:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过指定一个变量一组column==value条件来过滤pandasDataFrame的行。在

假设我们有一个像这样的玩具:

from itertools import product
from numpy.random import rand
df = pd.DataFrame([[i,j,k,rand()] for i,j,k,m in product(range(2), repeat=3)],
                    columns=['par1','par2','par3','val'])

其中一些行看起来像:

^{pr2}$

我想知道通过指定一些行来选择某些行的最佳方法是什么 column==value不需要包含所有列,也不需要总是相同的列甚至相同的列数的条件。我认为dict是一种相当自然的指定条件的方法:

conditions = {'par1':1, 'par3':0}

在这种情况下,df.par2的任何值都可以。在

df.isin()

我知道df.isin()dict参数以及all(1)as shown in the docs(该节的最后一段代码)。问题是,在df.isin()调用中未通过条件的列中的值给出False,因此对all(1)的后续调用给出了一个空的数据帧。(一种解决方法是用所有可能的值来添加所有缺少的列,但这听起来不是一个好的解决方案)

df.query()

在写问题的时候,我想出了另一个办法。这个看起来更好:从条件dict自动构建查询。在

df.query(' & '.join(['({} == {})'.format(k,v)
                     for k,v in conditions.iteritems()]))

它按预期工作。。。在

   par1  par2  par3       val
4     1     0     0  0.035160
6     1     1     0  0.172746

不过,我还不完全相信,我想知道有没有更自然/恰当/清晰的方法来做这件事。。。我对熊猫的印象总是很好。。。:P


Tags: 方法infromimportdfvaluecolumnproduct
1条回答
网友
1楼 · 发布于 2024-04-27 03:45:50

您可以制作一系列conditions,然后只选择这些列:

>>> df[(df[list(conditions)] == pd.Series(conditions)).all(axis=1)]
   par1  par2  par3       val
4     1     0     0  0.937192
6     1     1     0  0.536029

这是因为在我们制作了系列之后,它比较了我们需要它的方式:

^{pr2}$

相关问题 更多 >