我有以下数据框,这是比赛和结果列表。
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
答案 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,您希望有人输入R
和H
来获取值...您可以在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