Estou começando com dados de entrada como este
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Que quando impresso aparece assim:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
O agrupamento é bastante simples:
g1 = df1.groupby( [ "Name", "City"] ).count()
e a impressão produz um GroupBy
objeto:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Mas o que eu quero eventualmente é outro objeto DataFrame que contenha todas as linhas no objeto GroupBy. Em outras palavras, quero obter o seguinte resultado:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
Não vejo como fazer isso na documentação dos pandas. Qualquer dica seria bem-vinda.
python
pandas
dataframe
pandas-groupby
multi-index
saveenr
fonte
fonte
Empty DataFrame
Columns: []
Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
Respostas:
g1
aqui está um DataFrame. Possui um índice hierárquico:Talvez você queira algo assim?
Ou algo como:
fonte
reset.index()
faz o trabalho, ótimo!df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
.reset_index()
me parece ser a melhor maneira de juntar a saída que você obterádf.groupby('some_column').apply(your_custom_func)
. Isso não foi intuitivo para mim.pandas.core.groupby.DataFrameGroupBy
objeto, nãopandas.core.frame.DataFrame
.Quero mudar um pouco a resposta dada por Wes, porque a versão 0.16.2 exige
as_index=False
. Se você não configurá-lo, receberá um quadro de dados vazio.Fonte :
EDITAR:
Na versão
0.17.1
e posterior, você pode usarsubset
incount
ereset_index
com o parâmetroname
insize
:A diferença entre
count
esize
é quesize
conta os valores de NaN enquantocount
não conta.fonte
df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
as_index=False' stopped working in latest versions? I also tried to run
df1.groupby (["Name", "City"], como_index = False) .size () `mas não afeta o resultado (provavelmente porque o resultado do agrupamentoSeries
não éDataFrame
groupby
por essas colunas. Mas não tenho certeza, porque não sou desenvolvedor de pandas.Simplesmente, isso deve fazer a tarefa:
Aqui,
grouped_df.size()
o grupo exclusivo é contado e oreset_index()
método redefine o nome da coluna que você deseja que seja. Finalmente, aDataframe()
função pandas é chamada para criar um objeto DataFrame.fonte
A chave é usar o método reset_index () .
Usar:
Agora você tem seu novo quadro de dados em g1 :
fonte
Talvez eu entenda mal a pergunta, mas se você deseja converter o grupo de volta em um dataframe, pode usar .to_frame (). Eu queria redefinir o índice quando fiz isso, então incluí essa parte também.
código de exemplo não relacionado à pergunta
fonte
Eu achei que isso funcionou para mim.
fonte
A solução abaixo pode ser mais simples:
fonte
Agreguei dados Qty sábios e armazenei no dataframe
fonte
Essas soluções funcionaram apenas parcialmente para mim porque eu estava fazendo várias agregações. Aqui está um exemplo de saída do meu agrupado por que eu queria converter em um dataframe:
Como eu queria mais do que a contagem fornecida por reset_index (), escrevi um método manual para converter a imagem acima em um quadro de dados. Entendo que essa não é a maneira mais pitônica / panda de fazer isso, pois é bastante detalhada e explícita, mas era tudo o que eu precisava. Basicamente, use o método reset_index () explicado acima para iniciar um quadro de dados "andaimes", depois percorra os pares de grupos no quadro de dados agrupado, recupere os índices, execute seus cálculos no quadro de dados não agrupado e defina o valor no seu novo quadro de dados agregado .
Se você não gosta de um dicionário, os cálculos podem ser aplicados em linha no loop for:
fonte