J'ai un Dataframe comme celui-ci: Je veux ajouter une colonne d'entier séquentielle unique à nom fort>, comme ceci: p> < PRE> XXX PRE> Y a-t-il une élégante pandas one- (ou deux) doublure pour faire cela? Je suis nouveau à Pandas et suspect Il y a un moyen de le faire en combinant une combinaison de Groupby et de Lambda, mais je ne fais pas de progrès. P> p>
3 Réponses :
Vous pouvez laisser
Et si les valeurs code> nom code> ne sont pas triées?
L'exemple fourni suggérerait qu'ils sont. @Superduper?
Oui, dans mon cas, ils sont triés, donc cette réponse fonctionne, mais pour l'utilisation générale, la factorisation semble meilleure. Et juste une note pour les futurs visiteurs: cette solution et la solution acceptée fonctionnent, mais dans mon cas, a abouti à un configuration de transfects (noyau Python 3.7 à Jupterylab 0,35,3)
Essayez ceci:
df.set_index((~df.name.duplicated()).cumsum())
name food
name
1 mike pizza
1 mike cookie
1 mike banana
2 mary apple
2 mary pear
3 jane broccoli
Vous pouvez utiliser sortie: p> puisse_index ID: < / p> sortie: p> PD.Factorize code>:
Toutes les autres réponses sont super, et franchement, je n'avais pas compris à quel point je savais que peu je savais - les solutions de chacun entraînent des indices appropriés de Dataframe - que je ne savais pas était une chose; Je voulais juste que la colonne de valeurs, que les solutions de cette et de Fuglede accomplissent dans une ligne. Celui-ci semble être un sort insensible, qui est un bonus.
df ["nom"]. Astype ("catégorie"). Cat.codes Code>Unique à chaque nom, ou unique à chaque regroupement consécutif de noms (que les réponses postées semblent accomplir). Avec un fichier de données trié, ceux-ci peuvent être identiques, mais en général ne le sont pas.
df.groupby ('Nom', Trier = FALSE) .ngroup () + 1 code> est probablement ce que vous voulez. C'est unique par nom et le comptoir est basé sur l'occurrence dans le Dataframe, pas de tri lexicographique.