Ao usar "df [" categoria "]. Value_counts ()", ele diz que é um int? mas retorna o nome da coluna como índice? É um objeto de quadro de dados ou de alguma forma combina uma série (as contagens) e os valores originais da coluna original?
yoshiserry
@yoshiserry É uma série Pandas fazer type(df['category'].value_counts())e ele vai dizer isso
EdChum
Eu fiz, e fiquei surpresa com isso, mas faz sentido quanto mais eu penso sobre isso. Depois de fazer isso, o valor conta em algumas colunas, e há linhas que eu gostaria de excluir. Sei como remover colunas, mas como excluo linhas?
yoshiserry
Respostas:
414
Use groupbye count:
In[37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()Out[37]:
a
a
a 2
b 3
s 2[3 rows x 1 columns]
@yoshiserry Não, o que você vê é que ele cria uma série que se alinha com o quadro de dados original, ao contrário dos outros métodos que exibem os valores exclusivos e sua frequência, se você quiser apenas adicionar a contagem de frequências ao quadro de dados para o qual você pode usar a transformação isto. É apenas outra técnica, você percebe que ele não reduziu o quadro de dados após a atribuição de volta e não há valores ausentes. Também acho que Dataframes sempre tem um índice Eu não acho que você pode se livrar dele, apenas a redefini-la, atribuir um novo ou usar uma coluna como um índice
EdChum
4
No seu primeiro exemplo de código, o df é atribuído conforme o esperado, mas esta linha: df.groupby ('a'). Count () retorna um quadro de dados vazio. É possível que essa resposta esteja desatualizada com os pandas 0.18.1? Além disso, é um pouco confuso que o nome da sua coluna 'a' seja o mesmo que o valor que você está procurando 'a'. Eu mesmo o editaria, mas como o código não funciona para mim, não posso ter certeza das minhas edições.
28416 Alex
1
@Alex você está correto parece que nas versões mais recentes isso não funciona mais, parece ser um bug para mim como eu não vejo por que não
EdChum
1
Por que não usar em df.['a'].value_counts().reset_index()vez de df.groupby('a')['a'].transform('count')?
conjunto
1
@ tandem, eles fazem coisas diferentes, a chamada value_countsgerará uma contagem de frequência, se você quiser adicionar o resultado novamente como uma nova coluna em relação ao seu df original, precisará usar transformconforme detalhado na minha resposta.
EdChum
93
Se você deseja aplicar a todas as colunas, pode usar:
df.apply(pd.value_counts)
Isso aplicará uma função de agregação baseada em coluna (neste caso, value_counts) a cada uma das colunas.
Essa é a resposta mais simples. Isso deve estar no topo.
Jeffrey Jose
4
Essa resposta é simples, mas (acredito) a applyoperação não aproveita as vantagens que as matrizes Numpy vetorizadas como as colunas fornecem. Como resultado, o desempenho pode ser um problema em conjuntos de dados maiores.
kuanb
58
df.category.value_counts()
Essa pequena linha de código fornecerá a saída desejada.
Se o nome da sua coluna tiver espaços, você poderá usar
Isso fornecerá uma boa tabela de contagens de valor e um pouco mais :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster já apontou isso. Vá em frente Counter. Está super rápido.
import pandas as pd
from collections importCounterimport timeit
import numpy as np
df = pd.DataFrame(np.random.randint(1,10000,(100,2)), columns=["NumA","NumB"])
Temporizadores
%timeit -n 10000 df['NumA'].value_counts()# 10000 loops, best of 3: 715 µs per loop%timeit -n 10000 df['NumA'].value_counts().to_dict()# 10000 loops, best of 3: 796 µs per loop%timeit -n 10000Counter(df['NumA'])# 10000 loops, best of 3: 74 µs per loop%timeit -n 10000 df.groupby(['NumA']).count()# 10000 loops, best of 3: 1.29 ms per loop
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
e ele vai dizer issoRespostas:
Use
groupby
ecount
:Consulte os documentos on-line: http://pandas.pydata.org/pandas-docs/stable/groupby.html
Também
value_counts()
como o @DSM comentou, muitas maneiras de esfolar um gato aquiSe você deseja adicionar a frequência novamente ao quadro de dados original, use
transform
para retornar um índice alinhado:fonte
df.['a'].value_counts().reset_index()
vez dedf.groupby('a')['a'].transform('count')
?value_counts
gerará uma contagem de frequência, se você quiser adicionar o resultado novamente como uma nova coluna em relação ao seu df original, precisará usartransform
conforme detalhado na minha resposta.Se você deseja aplicar a todas as colunas, pode usar:
Isso aplicará uma função de agregação baseada em coluna (neste caso, value_counts) a cada uma das colunas.
fonte
apply
operação não aproveita as vantagens que as matrizes Numpy vetorizadas como as colunas fornecem. Como resultado, o desempenho pode ser um problema em conjuntos de dados maiores.Essa pequena linha de código fornecerá a saída desejada.
Se o nome da sua coluna tiver espaços, você poderá usar
fonte
df['category 1'].value_counts()
value_counts - Retorna um objeto contendo contagens de valores únicos
apply - count frequency em todas as colunas. Se você definir
axis=1
, obterá frequência em todas as linhasfillna (0) - torna a saída mais sofisticada. NaN alterado para 0
fonte
Em 0.18.1,
groupby
juntamente comcount
não fornece a frequência de valores únicos:No entanto, os valores únicos e suas frequências são facilmente determinados usando
size
:Com
df.a.value_counts()
valores classificados (em ordem decrescente, ou seja, o maior valor primeiro) são retornados por padrão.fonte
Usando compreensão de lista e value_counts para várias colunas em um df
https://stackoverflow.com/a/28192263/786326
fonte
Se a sua trama de dados tem valores com o mesmo tipo, você também pode definir
return_counts=True
em numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () pode ser mais rápido se seus valores forem números inteiros.
fonte
Sem nenhuma biblioteca, você poderia fazer isso:
Exemplo:
fonte
Você também pode fazer isso com os pandas transmitindo suas colunas como categorias primeiro, por
dtype="category"
exemplo , por exemploe depois chamando
describe
:Isso fornecerá uma boa tabela de contagens de valor e um pouco mais :):
fonte
Primeira contagem de valores exclusivos
Segunda contagem de valores exclusivos
Resultado:
Resultado:
fonte
@metatoaster já apontou isso. Vá em frente
Counter
. Está super rápido.Temporizadores
Felicidades!
fonte
Use este código:
fonte
solução:
fonte
Eu acredito que isso deve funcionar bem para qualquer lista de colunas do DataFrame.
A função "column_list" verifica os nomes das colunas e, em seguida, verifica a exclusividade dos valores de cada coluna.
fonte