Соедините две таблицы с критериями диапазона, используя Python Pandas - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть проблема, аналогичная этой упрощенной версии:

Результат эксперимента сохраняется в листе Excel, и я обработал данные с помощью Python Pandas и преобразовал их в DataFrames.

ДваТаблицы приведены ниже: Table_Race save в DataFrame race Table_standard save в DataFrame std

>>> data = [["Gold+",1,30,35],["Silver+",1,25,30],["Bronze+",1,20,25],["Gold",2,20,25],["Silver",2,15,20],["Bronze",2,10,15]]
>>> std = pd.DataFrame(data,columns=['Title','League','Start','End'])
>>> std
     Title  League  Start  End
0    Gold+       1     30   35
1  Silver+       1     25   30
2  Bronze+       1     20   25
3     Gold       2     20   25
4   Silver       2     15   20
5   Bronze       2     10   15
>>> data = [["John",1,26],["Ryan",1,33],["Mike",1,9],["Jo",2,15],["Riko",2,21],["Kiven",2,13]]
>>> race = pd.DataFrame(data,columns=['Name','League','Distance'])
>>> race
    Name  League  Distance
0   John       1        26
1   Ryan       1        33
2   Mike       1         9
3     Jo       2        21
4   Riko       2        15
5  Kiven       2        13
>>> 

Я хотел бы проверить расстояние для каждого игрока и получить его титул в соответствии со стандартами:

    Title <= distance in [start, end) and need to match league

Например: Джо из лиги 2 и имеет расстояние 15, которое находится между [15,20].Обратите внимание, что это не [10,15), поэтому он получает титул «Серебро»

Ожидаемый результат выглядит следующим образом:

    Name    League  Distance    Title
    John    1       26          Silver+
    Ryan    1       33          Gold+
    Mike    1       9           N/A
    Jo      2       21          Gold
    Riko    2       15          Silver
    Kiven   2       13          Bronze

Я могу добиться этого, используя два цикла, которые в основном получают каждое расстояниеиз Table_race и ищите (l, d) из каждого ряда расы (Лига, Дистанция)

Ищете условие:

    l == League && d >= Start && d < End

Но этот метод O (N ^ 2), которыйслишком медленный, так как мои данные могут легко превысить 100 000, что занимает несколько часов.

Есть ли лучшие решения?

1 Ответ

0 голосов
/ 26 апреля 2018

Все еще работает над решением, но здесь есть что начать:

>>> data = [["Gold+",1,30,35],["Silver+",1,25,30],["Bronze+",1,20,25],["Gold",2,20,25],["Silver",2,15,20],["Bronze",2,10,15]]
>>> std = pd.DataFrame(data,columns=['Title','League','Start','End'])
>>> std
     Title  League  Start  End
0    Gold+       1     30   35
1  Silver+       1     25   30
2  Bronze+       1     20   25
3     Gold       2     20   25
4   Silver       2     15   20
5   Bronze       2     10   15

>>> data = [["John",1,26],["Ryan",1,33],["Mike",1,9],["Jo",2,21],["Riko",2,15],["Kiven",2,13]]
>>> race = pd.DataFrame(data,columns=['Name','League','Distance'])
>>> race
    Name  League  Distance
0   John       1        26
1   Ryan       1        33
2   Mike       1         9
3     Jo       2        21
4   Riko       2        15
5  Kiven       2        13
>>> result=pd.merge(race,std,on='League')
>>> result = result[(result.Distance >= result.Start)&(result.Distance < result.End)][["Name","League","Distance","Title"]]
>>> result
     Name  League  Distance    Title
1    John       1        26  Silver+
3    Ryan       1        33    Gold+
9      Jo       2        21     Gold
13   Riko       2        15   Silver
17  Kiven       2        13   Bronze 

Слияние и Несколько условий ссылки для их учебных пособий и недостатков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...