Eu tenho meus dados no quadro de dados do pandas da seguinte forma:
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})
Então, meus dados se parecem com este
----------------------------
index A B
0 yes yes
1 yes no
2 yes no
3 yes no
4 no yes
5 no yes
6 yes no
7 yes yes
8 yes yes
9 no no
-----------------------------
Eu gostaria de transformá-lo em outro quadro de dados. A saída esperada pode ser mostrada no seguinte script Python:
output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})
Então, minha saída esperada é assim
--------------------------------------------
index A B count
--------------------------------------------
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
--------------------------------------------
Na verdade, posso encontrar todas as combinações e contá-las usando o seguinte comando: mytable = df1.groupby(['A','B']).size()
No entanto, verifica-se que tais combinações estão em uma única coluna. Gostaria de separar cada valor em uma combinação em colunas diferentes e também adicionar mais uma coluna para o resultado da contagem. É possível fazer isso? Posso ter suas sugestões? Agradeço antecipadamente.
set_index()
. Continuei tentando usargroupby()
para agrupar linhas com um determinado par comum de colunas. Incrível, obrigado!Colocando a ótima resposta de @EdChum em uma função
count_unique_index
. O método exclusivo funciona apenas em séries de pandas, não em quadros de dados. A função abaixo reproduz o comportamento da função única em R:E adiciona uma contagem das ocorrências solicitadas pelo OP.
fonte
Eu não fiz teste de tempo com isso, mas foi divertido de tentar. Basicamente, converta duas colunas em uma coluna de tuplas. Agora converta isso para um dataframe, faça 'value_counts ()' que encontra os elementos únicos e os conta. Brinque com o zip novamente e coloque as colunas na ordem que desejar. Você provavelmente pode tornar as etapas mais elegantes, mas trabalhar com tuplas me parece mais natural para este problema
fonte