Как сделать группировку по двум параметрам и получить на выходе вложенный словарь без кортежа?

Рейтинг: 2Ответов: 1Опубликовано: 21.02.2023

В датафрейме в одном столбце "Номер" есть повторяющиеся значения для группировки, во втором столбце "Пол" либо М, либо Ж. Группировка требуется по 2-ум столбцам для подсчета количества М и Ж в каждом пуле, объединенном по номеру столбца "Номер".

Такой вариант возвращает в качестве ключа кортеж:

def file_stats(df):

    stat = {}
    
    # Количество М и Ж
    sex = df.groupby(['Номер', 'Пол'])['Пол'].size()
    sex = sex.to_dict()
    stat['sex'] = sex
    print(stat)

Результат:

{'sex': {(1, 'Ж'): 10, (1, 'М'): 35, (2, 'Ж'): 15, (2, 'М'):9}}       

Однако требуется на выходе получить следующий словарь:

{'sex': {1: {'Ж': 10, 'М': 35}}, 2: {'Ж': 15, 'М': 9}} 

Через функции агрегации результат практически аналогичный.

Ответы

▲ 2Принят

встроенной функции, похоже, нет, но можно построить ручками нужный словарь

sex = sex.to_frame()
print(sex.groupby(level=0).apply(lambda x: x.xs(x.name)['Пол'].to_dict()).to_dict()
# {1: {'Ж': 10, 'М': 35}, 2: {'Ж': 15, 'М': 9}}