Je pense que c'est une question rudimentaire, mais je suis très nouveau dans ce domaine et je n'ai tout simplement pas été en mesure de la résoudre / de trouver la réponse.
En fin de compte, ce que j'essaie de faire ici, c'est de compter les valeurs uniques sur une certaine colonne, puis de déterminer lesquelles de ces valeurs uniques ont plus d'une valeur unique dans une colonne correspondante.
Donc, pour ces données, ce que j'essaie de déterminer, c'est «qui» a «plus d'un reçu» pour tous les achats, puis déterminez les mêmes informations en fonction de chaque catégorie de produit.
Mon approche jusqu'à présent:
Nous avons un ensemble de données comme celui-ci:
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
Alors je peux faire ça:
df.set_index(['name','receipt'])
Et obtenez le plus intéressant
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
À ce stade, il me semble que les données sont faciles à utiliser, mais je ne l'ai pas compris.
Une chose qui m'intéresse est que si je trie les données par nom avant de les indexer, les données s'affichent groupées par nom. Dans les deux cas, l'index est le même, donc je ne sais pas comment jouer avec la représentation des données après l'indexation.
Il est facile de trouver les données par catégorie en utilisant
>>> orders.loc[orders['category'] == 'fish']
etc category
name receipt
george 1 xxx fish
2 xxx fish
bill 3 xxx fish
george 6 xxx fish
Mais ce que je ne peux pas comprendre, c'est comment dire aux pandas "Trouvez-moi la liste des noms qui ont plus d'un reçu".
Questions plus petites:
- Quelle est la «manière pandas» pour obtenir la longueur de la partie des noms de l'index? Je suppose que je pourrais simplement transformer la
name
colonne en un ensemble et obtenir la longueur de cela. Mais je suis curieux de connaître les index.
Modifier / mettre à jour
Merci pour ces réponses! Voici des précisions sur ce que je recherche:
J'essaie de trouver des «clients réguliers»: des personnes avec plus d'un reçu.
Donc, mon ensemble de tous les clients serait:
names: ['george','bill','jill'], ratio: 1.0
Mes clients réguliers:
names: ['george','bill'], ratio 0.66
Tous les clients «poissons»:
names: ['george','bill'], ratio: 0.666
Mes clients fidèles «poissons»:
names: ['george'], ratio: 0.333
Je pense que les exemples donnés semblent utiles, mais n'hésitez pas à ajouter quoi que ce soit.
Réponses:
Je pense que vous cherchez peut-être:
Ou, si vous voulez simplement le total dans toutes les catégories:
Ensuite, vous pouvez rechercher ceux qui en ont plus d'un:
Et, vous pouvez trouver la longueur d'un index en tapant:
En supposant que le nom était la première colonne d'index (sinon remplacez 1, 2, etc.)
la source
receipts_by_name = df.groupby(['name']).unique()
prendre la réponse dans la colonne «reçu», je pense. Il vous suffit d'appliquer une fonction de groupby différente.On ne sait pas exactement ce que vous essayez d'atteindre (il serait utile de comprendre vos objectifs si vous publiez les ensembles de données souhaités / attendus) ...
Mais je vais essayer de deviner;)
Les données:
Définition de la colonne virtuelle
count
, affichage du nombre de lignes regroupéesname
et filtrage (interrogation) à l'aide de la.query()
méthode:ou vous pouvez regrouper par plusieurs colonnes et filtrer les groupes résultants:
la source