Python / Pandas: Dataframe несколько фильтров - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть следующий фрейм данных, который является списком гонок и результатов.

      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 голосов
/ 29 апреля 2018

Словарь - это опция для хранения скачек и лошадей, в которой вам не нужно создавать ненужные переменные каждый раз, когда вы запускаете новую настройку фильтрации, здесь я использую словарь с ключами = скачками и значениями = списком лошадей

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()])

В этом примере строка, сгенерированная с помощью списка 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]}
0 голосов
/ 29 апреля 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...