Python / Pandas:Dataframe多个过滤器

时间:2018-04-29 13:05:01

标签: python pandas dataframe filter

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

      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(即滤除H 3代表R 1)。对于R = 2,我想仅看到H 1(即滤除H 2用于R 2)并且对于R = 3我只想看到H 2(即滤除H 1用于R 3)。我会通过最好通过提示设置变量来实现这一点。基本上我正在尝试"刮擦"特定种族的某些马匹

下面的结果示例

      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   

2 个答案:

答案 0 :(得分:1)

字典是用于存储种族和马的选项,因为每次运行新的过滤设置时都不需要创建不必要的变量,这里我使用的字典包含keys = races和values = list of horses

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]}

答案 1 :(得分:0)

IIUC,您希望有人输入RH来获取值...您可以在input中使用python3

races = input("Enter races: ").split(",")
ind = []
for race in races:
    sub = df[df["R"] == int(race)]
    horses = input("Enter horses to show for race {0}: ".format(race)).split(",")
    rows = sub.H.isin(horses)
    ind.extend(rows[rows].index.values)

print(df[df.index.isin(ind)])

示例:

Enter races: 1,2
Enter horses for race 1: 1,2
Enter horses for race 2: 2
   R  H
0  1  1
1  1  2
4  2  2