Sinto que essa é uma pergunta rudimentar, mas sou muito nova nisso e simplesmente não consegui decifrá-la / encontrar a resposta.
Em última análise, o que estou tentando fazer aqui é contar valores exclusivos em uma determinada coluna e determinar quais desses valores únicos têm mais de um valor exclusivo em uma coluna correspondente.
Portanto, para esses dados, o que estou tentando determinar é "quem" possui "mais de um recibo" para todas as compras e, em seguida, determine as mesmas informações com base em cada categoria de produto.
Minha abordagem até agora:
Temos um conjunto de dados como este:
receipt,name,etc,category
1,george,xxx,fish
1,george,xxx,cat
2,george,xxx,fish
3,bill,xxx,fish
3,bill,xxx,dog
4,jill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,dog
6,george,xxx,fish
Então eu posso fazer isso:
df.set_index(['name','receipt'])
E obtenha o mais interessante
etc category
name receipt
george 1 xxx fish
1 xxx cat
2 xxx fish
bill 3 xxx fish
3 xxx dog
jill 4 xxx cat
bill 5 xxx cat
5 xxx cat
5 xxx dog
george 6 xxx fish
Neste ponto, parece-me que os dados são fáceis de trabalhar, mas ainda não os descobri.
Uma coisa que é interessante para mim é que, se eu classificar os dados por nome antes de indexá-los, os dados serão agrupados por nome. Nos dois casos, o índice é o mesmo, então não sei como jogar com a representação dos dados após a indexação.
É fácil encontrar os dados por categoria usando
>>> orders.loc[orders['category'] == 'fish']
etc category
name receipt
george 1 xxx fish
2 xxx fish
bill 3 xxx fish
george 6 xxx fish
Mas o que não consigo descobrir é como dizer aos pandas "Encontre-me a lista de nomes com mais de um recibo".
Perguntas menores:
- Qual é o "caminho dos pandas" para obter o comprimento dos nomes como parte do índice? Suponho que eu poderia transformar a
name
coluna em um conjunto e obter o comprimento disso. Mas estou curioso sobre índices.
Editar / Atualizar
Obrigado por essas respostas! Aqui estão os esclarecimentos sobre o que estou procurando:
Estou tentando encontrar "clientes recorrentes": pessoas com mais de um recibo.
Portanto, meu conjunto de todos os clientes seria:
names: ['george','bill','jill'], ratio: 1.0
Meus clientes recorrentes:
names: ['george','bill'], ratio 0.66
Todos os clientes 'peixe':
names: ['george','bill'], ratio: 0.666
Meus clientes repetidos 'peixe':
names: ['george'], ratio: 0.333
Acho que os exemplos apresentados parecem úteis, mas fique à vontade para adicionar qualquer coisa.
Respostas:
Eu acho que talvez você esteja procurando:
Ou, se você quiser apenas o total em todas as categorias:
Em seguida, você pode pesquisar aqueles que têm mais de um:
E, você pode encontrar o tamanho de um índice digitando:
Supondo que o nome fosse a primeira coluna do índice (caso contrário, substitua 1, 2 etc.)
fonte
receipts_by_name = df.groupby(['name']).unique()
responder a coluna "recibo", eu acho. Você só precisa aplicar uma função groupby diferente.Não está claro o que exatamente você está tentando alcançar (seria útil entender seus objetivos se você publicasse os conjuntos de dados desejados / esperados) ...
Mas vou tentar adivinhar;)
Dados:
Configurando a coluna virtual
count
, mostrando o número de linhas agrupadasname
e filtrando (consultando) usando o.query()
método:ou você pode agrupar por várias colunas e filtrar os grupos resultantes:
fonte