У меня есть проблема, аналогичная этой упрощенной версии:
Результат эксперимента сохраняется в листе 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, что занимает несколько часов.
Есть ли лучшие решения?