Conteggio degli indici nei panda


8

Sento che questa è una domanda rudimentale, ma sono molto nuovo e non sono stato in grado di risolverlo / trovare la risposta.

In definitiva, ciò che sto cercando di fare qui è contare valori univoci su una determinata colonna e quindi determinare quale di quei valori univoci ha più di un valore univoco in una colonna corrispondente.

Quindi, per questi dati, quello che sto cercando di determinare è "chi" ha "più di una ricevuta" per tutti gli acquisti, quindi determinare le stesse informazioni in base a ciascuna categoria di prodotto.

Il mio approccio finora:

Abbiamo un set di dati come questo:

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

Quindi posso farlo:

df.set_index(['name','receipt'])

E diventa più 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

A questo punto mi sembra che i dati siano facili da lavorare, ma non l'ho capito.

Una cosa che è interessante per me è che se ordino i dati per nome prima di indicizzarli, i dati vengono visualizzati raggruppati per nome. In entrambi i casi l'indice è lo stesso, quindi non so come giocare con la rappresentazione dei dati dopo l'indicizzazione.

È facile trovare i dati per 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

Ma quello che non riesco a capire è come dire ai panda "Trovami l'elenco di nomi che hanno più di una ricevuta".

Domande più piccole:

  • Qual è il "modo panda" per ottenere la lunghezza della parte dei nomi dell'indice? Suppongo che potrei semplicemente trasformare la namecolonna in un set e ottenerne la lunghezza. Ma sono curioso di conoscere gli indici.

Modifica / Aggiorna

Grazie per quelle risposte! Ecco un chiarimento su ciò che sto cercando:

Sto cercando di trovare "clienti abituali": persone con più di una ricevuta.

Quindi il mio set di tutti i clienti sarebbe:

names: ['george','bill','jill'], ratio: 1.0

I miei clienti abituali:

names: ['george','bill'], ratio 0.66

Tutti i clienti "pesce":

names: ['george','bill'], ratio: 0.666

I miei clienti 'pesce' ripetuti:

names: ['george'], ratio: 0.333

Penso che gli esempi forniti siano utili, ma sentiti libero di aggiungere qualsiasi cosa.


puoi pubblicare un set di dati risultante desiderato (previsto)?
MaxU

Risposte:


5

Penso che forse stai cercando:

receipts_by_name_x_cat = df.groupby(['name','category']).count()

Oppure, se vuoi solo il totale in tutte le categorie:

receipts_by_name = df.groupby(['name']).count()

Quindi, puoi cercare quelli che ne hanno più di uno:

receipts_by_name[receipts_by_name['receipt']>1]

E puoi trovare la lunghezza di un indice digitando:

len(df.index.get_level_values(0))

Supponendo che il nome fosse la prima colonna dell'indice (altrimenti sostituire 1, 2, ecc.)


Questo è estremamente utile. Tuttavia, ho formulato la mia domanda in modo errato. "Più di una ricevuta" dovrebbe essere "Più di una transazione, nel senso che hanno più di una ricevuta unica ".
Mr. Hasquestions,

Felice di sentirlo. Ri: la tua domanda, come sono i due diversi? cosa definisce una ricevuta unica: la colonna "ricevuta" è l'ID ricevuta? e la categoria sono tutti gli articoli che hanno acquistato su quella ricevuta? In tal caso, puoi provare a receipts_by_name = df.groupby(['name']).unique()prendere la risposta nella colonna "ricevuta", credo. Devi solo applicare una diversa funzione groupby.
Atkat12,

Bene, quindi un modo di pensarci è che ogni riga nel set di dati rappresenta un elemento pubblicitario in un acquisto, quindi la ricevuta è l '"ID ricevuta" di quella transazione. Quindi, ad esempio, Bill ha acquistato due articoli per gatti durante la transazione n. 5 ed è responsabile della transazione n. 2. Quindi è un "acquirente ripetuto" ma non è un "acquirente ripetuto" poiché i suoi acquisti di due gatti sono avvenuti durante la stessa transazione.
Mr. Hasquestions,

3

Non è del tutto chiaro cosa stai esattamente cercando di raggiungere (sarebbe utile capire i tuoi obiettivi se pubblichi set di dati desiderati / previsti) ...

Ma proverò a indovinare;)

Dati:

In [100]: df
Out[100]:
   receipt    name  etc category
0        1  george  xxx     fish
1        1  george  xxx      cat
2        2  george  xxx     fish
3        3    bill  xxx     fish
4        3    bill  xxx      dog
5        4    jill  xxx      cat
6        5    bill  xxx      cat
7        5    bill  xxx      cat
8        5    bill  xxx      dog
9        6  george  xxx     fish

Impostazione della colonna virtuale count, mostrando il numero di righe raggruppate namee filtrando (interrogando) con il .query()metodo:

In [101]: (df.assign(count=df.groupby('name').receipt.transform('size'))
     ...:    .query("category in ['dog','cat'] and count > 1"))
     ...:
Out[101]:
   receipt    name  etc category  count
1        1  george  xxx      cat      4
4        3    bill  xxx      dog      5
6        5    bill  xxx      cat      5
7        5    bill  xxx      cat      5
8        5    bill  xxx      dog      5

oppure puoi raggruppare per più colonne e filtrare i gruppi risultanti:

In [102]: df.groupby(['name','category']).filter(lambda x: len(x) > 2)
Out[102]:
   receipt    name  etc category
0        1  george  xxx     fish
2        2  george  xxx     fish
9        6  george  xxx     fish
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.