qual é a maneira mais eficiente de contar ocorrências em pandas?

131

Eu tenho um grande dataframe df (cerca de 12M linhas) com dizer:

df.columns = ['word','documents','frequency']

Portanto, o seguinte foi executado em tempo hábil:

word_grouping = df[['word','frequency']].groupby('word')
MaxFrequency_perWord = word_grouping[['frequency']].max().reset_index()
MaxFrequency_perWord.columns = ['word','MaxFrequency']

No entanto, isso está demorando muito tempo para ser executado:

Occurrences_of_Words = word_grouping[['word']].count().reset_index()

O que eu estou fazendo errado aqui? Existe uma maneira melhor de contar ocorrências em um grande quadro de dados?

df.word.describe()

funcionou muito bem, então eu realmente não esperava que esse quadro de dados Occurrences_of_Words demorasse muito para ser construído.

ps: Se a resposta for óbvia e você sentir a necessidade de me penalizar por fazer essa pergunta, inclua a resposta também. obrigado.

tipanverella
fonte

Respostas:

235

Eu acho que df['word'].value_counts()deveria servir. Ao pular a maquinaria de grupo, você economizará algum tempo. Não sei por que countdeveria ser muito mais lento que max. Ambos levam algum tempo para evitar valores ausentes. (Compare com size.)

De qualquer forma, value_counts foi especificamente otimizado para lidar com o tipo de objeto, como suas palavras, por isso duvido que você seja muito melhor que isso.

Dan Allan
fonte
25
Obrigado. Eu também achei isso útil para acelerar a contagem de um valor específico em uma série. por exemplo, df.word.value_counts()['myword']é duas vezes mais rápido que len(df[df.word == 'myword']).
fantabolous
Que tal contar em todo o DataFrame? Isso funciona para uma coluna.
Vaidøtas I. 23/01
2
Para responder minha própria pergunta (resolvida): .stack () function
Vaidøtas I.
@ Vaidøtas Ivøška, tenho lutado para usá-lo. Você poderia dar um exemplo? E se 'myword' não estiver na coluna? Em seguida, gera um KeyError.
Newbielp 21/02
2
@Newbielp, fiz o seguinte: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Sum () que equivale a definir cada coluna selecionada para o tipo str, empilhando todos os indivíduos colunas na parte superior, formando basicamente uma coluna e, em seguida, executando as value_counts () e sum () nessa coluna. :) A pilha é bastante útil, pode não ser a escolha mais óbvia, mas funcionou como um encanto para o meu caso de uso :)
Vaidøtas I.
19

Quando você quiser contar a frequência de dados categóricos em uma coluna no pandas dataFrame, use: df['Column_Name'].value_counts()

- Fonte .

Dwaraka Uttarkar
fonte
11

Apenas uma adição às respostas anteriores. Não devemos esquecer que, ao lidar com dados reais, pode haver valores nulos; portanto, é útil incluir também aqueles na contagem usando a opção dropna=False(o padrão éTrue )

Um exemplo:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
user2314737
fonte