Como agrupar valores idênticos e contar sua frequência em Python?

10

Iniciante no analytics com Python, por favor, seja gentil :-) Não consegui encontrar a resposta para esta pergunta - desculpe se ela já foi respondida em outro lugar em um formato diferente.

Eu tenho um conjunto de dados de dados de transação para um ponto de venda. Variáveis ​​junto com a explicação são:

  • seção: a seção da loja, um str;
  • nome_do_produto: nome do produto, um str;
  • recibo: o número da fatura, um int;
  • caixa, o número da caixa, um int;
  • custo: o custo do item, um flutuador;
  • data, no formato MM / DD / AA, um str;
  • hora, no formato HH: MM: SS, a str;

O recebimento tem o mesmo valor para todos os produtos comprados em uma única transação, portanto, pode ser usado para determinar o número médio de compras feitas em uma única transação.

Qual é a melhor maneira de fazer isso? Eu essencialmente quero usar groupby()para agrupar a variável de recebimento por suas próprias ocorrências idênticas, para que eu possa criar um histograma.

Trabalhando com os dados em um DataFrame do pandas.

EDITAR:

Aqui estão alguns dados de amostra com cabeçalho (nome_produto é realmente um número hexadecimal):

 section,prod_name,receipt,cashier,cost,date,time 
 electronics,b46f23e7,102856,5,70.50,05/20/15,9:08:20 
 womenswear,74558d0d,102857,8,20.00,05/20/15,9:12:46 
 womenswear,031f36b7,102857,8,30.00,05/20/15,9:12:47 
 menswear,1d52cd9d,102858,3,65.00,05/20/15,9:08:20 

Deste conjunto de amostras, esperaria um histograma de recebimento que mostre duas ocorrências do recebimento 102857 (desde que a pessoa comprou dois itens em uma transação) e uma ocorrência, respectivamente, do recebimento 102856 e do recebimento 102858. Nota: meu conjunto de dados não é grande, aproximadamente 1 milhão de linhas.

new_analyst
fonte
Concluído, adicionou alguns dados de amostra.
New_analyst

Respostas:

15

Deste conjunto de amostras, esperaria um histograma de recebimento que mostre duas ocorrências do recebimento 102857 (desde que essa pessoa comprou dois itens em uma transação) e uma ocorrência, respectivamente, do recebimento 102856 e do recebimento 102858.

Então você quer:

df.groupby ('recibo'). recibo.count ()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64
Emre
fonte
como o resultado não é mais um quadro de dados, como filtramos isso para mostrar apenas os valores que têm uma contagem superior a 1?
22618 Nikhil VJ
11
Você ainda pode fazer coisas como s[s>1], ondes=df.groupby('receipt').receipt.count()
Emre
2

Estou montando alguns tutoriais sobre disputa de dados. Talvez o meu notebook jupyter no github ajude. Eu acho que é a chave está modificando a linha:

df.groupby('male')['age'].mean()

ser estar:

df.groupby('reciept')['prod_name'].count()

Para agrupar por várias variáveis, isso deve funcionar:

df.groupby(['reciept','date'])['reciept'].count()
Ryan
fonte
Obrigado por isso. No entanto, algumas vezes o recebimento é repetido (quando a data também é diferente). Portanto, estamos agregando todas as diferentes ocorrências de recebimento, mesmo em datas diferentes, quando realmente queremos saber o número de recebimento por transação - no entanto, não há uma variável de ID de transação exclusiva. Não acho que o recebimento se repita no mesmo dia - podemos usar a data como uma forma de agrupar? df.groupby('reciept')['date'].count()dá o mesmo resultado quedf.groupby('reciept')['prod_name'].count()
new_analyst 22/04
Adicione a data como um parâmetro na chamada de grupo. Editou minha resposta acima para agrupar por vários vars.
22716 Ryan
0

Pelo que entendi, você precisaria de um histograma do seu recibo nº. Você pode tentar algo assim

import pandas as pd data = np.read_csv("your_file_path.csv") data.groupby(["receipt"])receipt.count().sort_values(ascending=False).head(20).plot.bar()

Isso fornecerá gráficos de barra dos números de cobrança mais repetitivos (20 mais repetidos) Altere o número na função de cabeçalho para obter mais ou menos.

Bharath KN
fonte