Я начинаю с входных данных, как это
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Который при печати выглядит так:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
Группировка достаточно проста:
g1 = df1.groupby( [ "Name", "City"] ).count()
и печать дает GroupBy
объект:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Но в конечном итоге мне нужен еще один объект DataFrame, который содержит все строки в объекте GroupBy. Другими словами, я хочу получить следующий результат:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
Я не совсем понимаю, как это сделать, в документации для панд. Любые намеки приветствуются.
Empty DataFrame
Columns: []
Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
Ответы:
g1
здесь есть DataFrame. Он имеет иерархический индекс, хотя:Возможно, вы хотите что-то подобное?
Или что-то вроде:
источник
reset.index()
делает работу, отлично!df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
.reset_index()
мне кажется лучшим способом объединения результатов, которые вы получитеdf.groupby('some_column').apply(your_custom_func)
. Это было не интуитивно для меня.pandas.core.groupby.DataFrameGroupBy
объект, а неpandas.core.frame.DataFrame
.Я хочу немного изменить ответ, данный Уэсом, потому что требуется версия 0.16.2
as_index=False
. Если вы не установите его, вы получите пустой фрейм данных.Источник :
РЕДАКТИРОВАТЬ:
В версии
0.17.1
и позже вы можете использоватьsubset
вcount
иreset_index
с параметромname
вsize
:Разница между
count
и вsize
том, чтоsize
подсчитывает значения NaN, тогдаcount
как нет.источник
df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
as_index=False' stopped working in latest versions? I also tried to run
df1.groupby ([ «Имя», «Город»], as_index = False) .size () ` , но это не влияет на результат (возможно , потому , что результат группирования являетсяSeries
неDataFrame
groupby
по этим столбцам. Но я не уверен, потому что я не разработчик панд.Просто, это должно сделать задачу:
Здесь
grouped_df.size()
поднимается уникальный счетчик групп, иreset_index()
метод сбрасывает имя столбца, которым вы хотите его видеть. Наконец,Dataframe()
функция pandas вызывается для создания объекта DataFrame.источник
Ключ должен использовать метод reset_index () .
Использование:
Теперь у вас есть новый фрейм данных в g1 :
источник
Возможно, я неправильно понял вопрос, но если вы хотите преобразовать группу обратно в фрейм данных, вы можете использовать .to_frame (). Когда я это сделал, я хотел сбросить индекс, поэтому я включил и эту часть.
пример кода не имеет отношения к вопросу
источник
Я обнаружил, что это работает для меня.
источник
Ниже решение может быть проще:
источник
Я агрегировал с кол-во мудрых данных и сохранить в dataframe
источник
Эти решения работали только частично для меня, потому что я делал несколько агрегаций. Вот пример выходных данных моей группы, которые я хотел преобразовать в кадр данных:
Поскольку я хотел большего, чем число, предоставляемое reset_index (), я написал ручной метод для преобразования изображения выше в кадр данных. Я понимаю, что это не самый питонский / панда способ сделать это, поскольку он довольно многословный и явный, но это было все, что мне было нужно. В основном, используйте метод reset_index (), описанный выше, чтобы запустить фрейм данных «scaffolding», затем выполните цикл по групповым спариваниям в сгруппированном фрейме данных, извлеките индексы, выполните вычисления для несгруппированного фрейма данных и установите значение в новом агрегированном фрейме данных. ,
Если вам не подходит словарь, вычисления могут быть встроены в цикл for:
источник