Python/Pandas:Dataframe多过滤器

2024-05-11 03:20:33 发布

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

我有下面的数据框,这是比赛和结果的列表。你知道吗

      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时,我只想看到h1和h2(即过滤掉r1的h3)。对于R=2,我只想看到h1(即过滤掉r2的h2),对于R=3,我只想看到h2(即过滤掉r3的h1)。我可以通过设置一个变量来实现这一点,最好是通过一个提示符。从本质上说,我是在试图从一个特定的比赛中“抓取”某些马

结果示例如下

      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   

Tags: 数据示例列表dateh2h1winh3
2条回答

IIUC,你希望有人输入RH来获取值。。。您可以在python3中使用input。你知道吗

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

字典是一个用于存储赛马的选项,因为每次运行新的筛选设置时都不需要创建不必要的变量,这里我使用的字典的键=赛马和值=马的列表

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

现在可以使用^{}函数,它接受一个查询字符串。这可以通过迭代字典来实现

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

相关问题 更多 >