6

Преобразование вывода GroupBy с многоуровневым индексом в Series обратно в DataFrame в Pandas

4

У меня есть DataFrame:

   Город     Имя
0  Сиэтл    Алиса
1  Сиэтл      Боб
2  Портленд  Мэллори
3  Сиэтл  Мэллори
4  Сиэтл      Боб
5  Портленд  Мэллори

Я выполняю групповую агрегацию:

g1 = df1.groupby(["Имя", "Город"]).count()

В результате вывода я получаю следующее:

                  Город  Имя
Имя     Город
Алиса  Сиэтл      1     1
Боб    Сиэтл      2     2
Мэллори Портленд  2     2
        Сиэтл      1     1

Но я хочу получить другой объект DataFrame, который будет содержать все строки из объекта GroupBy. Другими словами, я хочу получить следующий результат:

                  Город  Имя
Имя     Город
Алиса  Сиэтл      1     1
Боб    Сиэтл      2     2
Мэллори Портленд  2     2
Мэллори Сиэтл      1     1

Как это сделать?

5 ответ(ов)

7

g1 здесь является объектом DataFrame. У него есть иерархический индекс, как показано ниже:

In [19]: type(g1)
Out[19]: pandas.core.frame.DataFrame

In [20]: g1.index
Out[20]: 
MultiIndex([('Alice', 'Seattle'), ('Bob', 'Seattle'), ('Mallory', 'Portland'),
       ('Mallory', 'Seattle')], dtype=object)

Возможно, вам нужно что-то вроде этого?

In [21]: g1.add_suffix('_Count').reset_index()
Out[21]: 
      Name      City  City_Count  Name_Count
0    Alice   Seattle           1           1
1      Bob   Seattle           2           2
2  Mallory  Portland           2           2
3  Mallory   Seattle           1           1

Или что-то похожее на:

In [36]: DataFrame({'count' : df1.groupby( [ "Name", "City"] ).size()}).reset_index()
Out[36]: 
      Name      City  count
0    Alice   Seattle      1
1      Bob   Seattle      2
2  Mallory  Portland      2
3  Mallory   Seattle      1

Эти способы позволяют получить информацию о количестве записей в каждой группе, причем первый метод добавляет суффиксы к именам столбцов, а второй использует метод groupby для подсчета.

0

Простой способ выполнения этой задачи выглядит так:

import pandas as pd

grouped_df = df1.groupby(["Name", "City"])

pd.DataFrame(grouped_df.size().reset_index(name="Group_Count"))

В данном коде grouped_df.size() возвращает количество уникальных групп, а метод reset_index() используется для переименования столбца. В завершение, функция pd.DataFrame() создаёт объект DataFrame.

0

Может быть, я неправильно понял вопрос, но если вы хотите преобразовать результат группировки обратно в DataFrame, вы можете использовать метод .to_frame(). Я также хотел сбросить индекс при этом, поэтому включил этот шаг в код.

Пример кода, не связанного с вопросом:

df = df['TIME'].groupby(df['Name']).min()
df = df.to_frame()
df = df.reset_index(level=['Name', 'TIME'])
0

Я нашел, что этот код сработал для меня:

import numpy as np
import pandas as pd

df1 = pd.DataFrame({ 
    "Name": ["Alice", "Bob", "Mallory", "Mallory", "Bob", "Mallory"], 
    "City": ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"]})

df1['City_count'] = 1
df1['Name_count'] = 1

result = df1.groupby(['Name', 'City'], as_index=False).count()

Этот код создает DataFrame с именами и городами, а затем добавляет два новых столбца с подсчетом единиц. После этого он группирует данные по имени и городу, возвращая сумму значений для каждого столбца. Вы можете использовать такой подход, чтобы посчитать количество записей для каждой пары "имя-город".

0

Вот более простое решение:

df1.reset_index().groupby(["Name", "City"], as_index=False).count()

Этот код сначала сбрасывает индекс в датафрейме df1, а затем группирует данные по столбцам "Name" и "City", подсчитывая количество записей в каждой группе.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь