Как запросить MultiIndex по MultiIndex и выбрать «лучшую» строку?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как запросить MultiIndex по MultiIndex и выбрать «лучшую» строку?

Сообщение Anonymous »

Скажем, у меня есть MultiIndex от MultiIndex DataFrame, аналогичный тому, который сгенерирован здесь (в реальном случае список рас является динамическим и заранее неизвестен):< /p>
import random

import pandas as pd

random.seed(1)

data_frame_rows = pd.MultiIndex.from_arrays([[], [], []], names=("car", "engine", "wheels"))
data_frame_columns = pd.MultiIndex.from_arrays([[], [], []], names=("group", "subgroup", "details"))
data_frame = pd.DataFrame(index=data_frame_rows, columns=data_frame_columns)

for car in ("mustang", "corvette", "civic"):
for engine in ("normal", "supercharged"):
for wheels in ("normal", "wide"):
data_frame.loc[(car, engine, wheels), ("cost", "", "money ($)")] = int(random.random() * 100)
data_frame.loc[(car, engine, wheels), ("cost", "", "maintenance (minutes)")] = int(random.random() * 60)

for race in ("f1", "indy", "lemans"):
percent_win = random.random()
recommended = percent_win >= 0.8
data_frame.loc[(car, engine, wheels), ("race", race, "win %")] = percent_win
data_frame.loc[(car, engine, wheels), ("race", race, "recommended")] = recommended

Это будет выглядеть примерно так:
group cost race
subgroup f1 indy lemans
details money ($) maintenance (minutes) win % recommended win % recommended win % recommended
car engine wheels
mustang normal normal 13.0 50.0 0.763775 False 0.255069 False 0.495435 False
wide 44.0 39.0 0.788723 False 0.093860 False 0.028347 False
supercharged normal 83.0 25.0 0.762280 False 0.002106 False 0.445387 False
wide 72.0 13.0 0.945271 True 0.901427 True 0.030590 False
corvette normal normal 2.0 32.0 0.939149 True 0.381204 False 0.216599 False
wide 42.0 1.0 0.221692 False 0.437888 False 0.495812 False
supercharged normal 23.0 13.0 0.218781 False 0.459603 False 0.289782 False
wide 2.0 50.0 0.556454 False 0.642294 False 0.185906 False
civic normal normal 99.0 51.0 0.120890 False 0.332695 False 0.721484 False
wide 71.0 56.0 0.422107 False 0.830036 True 0.670306 False
supercharged normal 30.0 35.0 0.882479 True 0.846197 True 0.505284 False
wide 58.0 2.0 0.242740 False 0.797404 False 0.414314 False

Теперь я хочу найти все строки, в которых конкретная конфигурация автомобиля (комбинация двигателя и колес) является «лучшей» конфигурацией для этого автомобиля. Например, в данном случае у Civic есть две рекомендуемые конфигурации, а у Civic с наддувом двигателем и обычными колесами самый высокий шанс на победу в гонке (88% в гонке f1). Все остальные автомобили/конфигурации, которые не рекомендуются для участия в каких-либо гонках или имеют меньшие шансы на победу в какой-либо гонке, я хочу отфильтровать. Мустанг и корвет имеют по одной конфигурации, рекомендованной для любой гонки, поэтому я бы выбрал именно эти конфигурации для этих двух автомобилей.
Итак, Конечным результатом будет каждый автомобиль, указанный не более одного раза, с лучшей конфигурацией. Если у автомобиля нет рекомендуемых конфигураций, я хочу получить их полностью.
Я читал это несколько раз и, хоть убей, не могу в этом разобраться.
В качестве отправной точки для получения рекомендуемых строк я попробовал что-то вроде:
data_frame[(data_frame.loc[:,idx["race",:,"recommended"]]==True)]

Но это, похоже, не фильтрует строки, а просто устанавливает значение NaN или True
group cost race
subgroup f1 indy lemans
details money ($) maintenance (minutes) win % recommended win % recommended win % recommended
car engine wheels
mustang normal normal NaN NaN NaN NaN NaN NaN NaN NaN
wide NaN NaN NaN NaN NaN NaN NaN NaN
supercharged normal NaN NaN NaN NaN NaN NaN NaN NaN
wide NaN NaN NaN True NaN True NaN NaN
corvette normal normal NaN NaN NaN True NaN NaN NaN NaN
wide NaN NaN NaN NaN NaN NaN NaN NaN
supercharged normal NaN NaN NaN NaN NaN NaN NaN NaN
wide NaN NaN NaN NaN NaN NaN NaN NaN
civic normal normal NaN NaN NaN NaN NaN NaN NaN NaN
wide NaN NaN NaN NaN NaN True NaN NaN
supercharged normal NaN NaN NaN True NaN True NaN NaN
wide NaN NaN NaN NaN NaN NaN NaN NaN


Подробнее здесь: https://stackoverflow.com/questions/788 ... e-best-row
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как запросить MultiIndex по MultiIndex и выбрать «лучшую» строку?
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Ищу лучшую функцию в моей игре в понг
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Почему этот SIMD-код не показывает лучшую производительность?
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Tensorflow: можно сохранить лучшую модель только при наличии val_acc, пропуская
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как я могу оптимизировать процесс, чтобы найти лучшую четырехстороннюю форму, содержащую мою маску?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»