Преобразование вывода GroupBy с многоуровневым индексом в Series обратно в DataFrame в Pandas
У меня есть 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 ответ(ов)
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
для подсчета.
Простой способ выполнения этой задачи выглядит так:
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.
Может быть, я неправильно понял вопрос, но если вы хотите преобразовать результат группировки обратно в DataFrame, вы можете использовать метод .to_frame()
. Я также хотел сбросить индекс при этом, поэтому включил этот шаг в код.
Пример кода, не связанного с вопросом:
df = df['TIME'].groupby(df['Name']).min()
df = df.to_frame()
df = df.reset_index(level=['Name', 'TIME'])
Я нашел, что этот код сработал для меня:
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 с именами и городами, а затем добавляет два новых столбца с подсчетом единиц. После этого он группирует данные по имени и городу, возвращая сумму значений для каждого столбца. Вы можете использовать такой подход, чтобы посчитать количество записей для каждой пары "имя-город".
Вот более простое решение:
df1.reset_index().groupby(["Name", "City"], as_index=False).count()
Этот код сначала сбрасывает индекс в датафрейме df1
, а затем группирует данные по столбцам "Name" и "City", подсчитывая количество записей в каждой группе.
Получить статистику для каждой группы (например, количество, среднее и т.д.) с помощью pandas GroupBy?
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Как проверить, пустой ли DataFrame в pandas?
Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas