Доступ к мультииндексу pd.Series с помощью get() не находит элемент

#python #pandas #multi-index

Вопрос:

Ниже приведен минимальный пример моего кода.

У меня есть сгруппированная серия pd.с несколькими индексами , и я могу использовать доступ к отдельным элементам grouped["stallion", "london"] , но при использовании grouped.get(["stallion", "london"]) результат равен None (или -1, если задано значение по умолчанию).

 import pandas as pd

a = pd.DataFrame({"breed": ["stallion", "stallion", "stallion", "stallion", "pony", "pony", "pony"],
                  "stable": ["hogwarts", "hogwarts", "london", None, "hogwarts", "london", "london"],
                  "weight": [800, 900, 982, 400, 230, 300, 500]})

grouped = a.groupby(["breed", "stable"], dropna=False)["weight"].mean()
grouped = grouped.append(a.groupby("breed", dropna=False)["weight"].mean())
grouped = grouped.append(pd.Series(a["weight"].mean(), index=["all_breeds"]))

print(grouped)
print()
print(grouped["stallion", "london"])
print(grouped.get(["stallion", "london"]))
print(grouped.get(["stallion", "london"], -1))

print(f'The same? {grouped["stallion", "london"] == grouped.get(["stallion", "london"]) == grouped.get(["stallion", "london"], -1)}')
 

Ожидаемое Поведение
Я ожидаю, что все три строки дадут мне один и тот же результат:
grouped["stallion", "london"] == grouped.get(["stallion", "london"]) == grouped.get(["stallion", "london"], -1)

Причина использования get() заключается в том, что я хочу получить наилучший результат записи, который я могу найти:

 grouped.get(["stallion", "london"], grouped.get("stallion", grouped["all_breeds"]))
 

Ответ №1:

Вы должны использовать кортеж для получения значений, потому что ваш индекс содержит кортежи (это не мультииндекс).

 >>> grouped.index
Index([    ('pony', 'hogwarts'),       ('pony', 'london'),
       ('stallion', 'hogwarts'),   ('stallion', 'london'),
              ('stallion', nan),                   'pony',
                     'stallion',             'all_breeds'],
      dtype='object')
 
 >>> grouped.get(["stallion", "london"])
None

>>> grouped.get(("stallion", "london"))
982.0

###

>>> grouped.get(["stallion", "london"], -1)
-1

>>> grouped.get(("stallion", "london"), -1)
982.0
 

Примечание grouped["stallion", "london"] эквивалентно grouped[("stallion", "london")] , но кортеж неявен.

Конечный результат:

 >>> grouped.get(("stallion", "london"), grouped.get("stallion", grouped["all_breeds"]))
982.0