首页 > 解决方案 > Python / Pandas:数据框多个过滤器

问题描述

我有以下数据框,它是比赛和结果的列表。

      Date       R   H   Fin  Win
0     11182017   1   1   2     0 
1     11182017   1   2   1     5   
2     11182017   1   3   3     0   
3     11182017   2   1   2     0   
4     11182017   2   2   1     10   
5     11182017   3   1   1     6    
6     11182017   3   2   2     0   

我希望能够先按种族(R)然后按马(H)过滤并返回结果。

对于上面的数据集,当 R = 1 时,我只想看到 H 1 和 2(即为 R 1 过滤掉 H 3)。对于R = 2,我只想看到H 1(即过滤掉R 2 的H 2),而对于R = 3,我只想看到H 2(即过滤掉R 3 的H 1)。我会通过最好通过提示设置变量来完成此操作。本质上,我试图从特定比赛中“抓”某些马

结果示例如下

      Date       R   H   Fin  Win
0     11182017   1   1   2     0 
1     11182017   1   2   1     5    
3     11182017   2   1   2     0   
6     11182017   3   2   2     0   

标签: pythonpandasdataframefilter

解决方案


字典是存储比赛和马匹的一种选择,因为每次运行新的过滤设置时都不需要创建不必要的变量,这里我使用带有键 = 比赛和值 = 马列表的字典

d = {1:[1,2],2:[1]}

现在您可以使用该query函数,它接受一个查询字符串。这可以通过迭代字典来完成

query_str = ' | '.join(['((R == {x}) and (H in {y}))'.format(x=x,y=y) for x,y in d.items()])

在此示例中,使用 list comp 生成的字符串如下所示

((R == 1) and (H in [1, 2])) | ((R == 2) and (H in [1]))

现在你可以运行

df.query(query_str)

并得到

       Date  Fin  H  R  Win
0  11182017    2  1  1    0
1  11182017    1  2  1    5
3  11182017    2  1  2    0

用户输入创建字典的附加说明

代码

d = {}
x = input('Add races ')
for i in x:
    d[i] = list(input('Add Horses for Race: {} '.format(i)))
print d

样品运行

Add races 1,2,3
Add Horses for Race: 1 1,2
Add Horses for Race: 2 2,3
Add Horses for Race: 3 3,4
{1: [1, 2], 2: [2, 3], 3: [3, 4]}

推荐阅读