J'ai un dataframe avec des valeurs de répétition dans la colonne A. Je veux supprimer les doublons, en conservant la ligne avec la valeur la plus élevée dans la colonne B.
Donc ça:
A B
1 10
1 20
2 30
2 40
3 10
Devrait se transformer en ceci:
A B
1 20
2 40
3 10
Wes a ajouté quelques fonctionnalités intéressantes pour supprimer les doublons: http://wesmckinney.com/blog/?p=340 . Mais AFAICT, il est conçu pour les doublons exacts, il n'y a donc aucune mention de critères pour sélectionner les lignes à conserver.
Je suppose qu'il y a probablement un moyen facile de le faire - peut-être aussi simple que de trier le dataframe avant de supprimer les doublons - mais je ne connais pas assez bien la logique interne de groupby pour le comprendre. Aucune suggestion?
Réponses:
Cela prend le dernier. Pas le maximum cependant:
Vous pouvez également faire quelque chose comme:
la source
cols
ettake_last
sont amortis et ont été remplacés par les paramètressubset
etkeep
. pandas.pydata.org/pandas-docs/version/0.17.1/generated/…FutureWarning: the take_last=True keyword is deprecated, use keep='last' instead
df.sort_values(by=['B']).drop_duplicates(subset=['A'], keep='last')
? Je veux dire que ce sort_values me semble sûr mais je n'ai aucune idée si c'est réellement le cas.group_by
, vous pouvez ajouter.reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Cela réinitialisera l'index car sa valeur par défaut serait un Multindex compsed de'A'
et'C'
La réponse principale est de faire trop de travail et semble être très lent pour des ensembles de données plus volumineux.
apply
est lent et doit être évité si possible.ix
est obsolète et doit également être évité.Ou regroupez simplement toutes les autres colonnes et prenez le maximum de la colonne dont vous avez besoin.
df.groupby('A', as_index=False).max()
la source
lamba
fonction lors de la suppression. Par exemple, comment puis-je supprimer uniquement les valeurs inférieures à la moyenne de ces valeurs en double.Solution la plus simple:
Pour supprimer les doublons basés sur une colonne:
Pour supprimer les doublons basés sur plusieurs colonnes:
la source
Essaye ça:
la source
Je trierais d'abord le dataframe avec la colonne B décroissante, puis supprimerais les doublons pour la colonne A et garderais en premier
sans aucun groupby
la source
Vous pouvez également essayer ceci
J'ai fait référence à cela de https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
la source
Je pense que dans votre cas, vous n'avez pas vraiment besoin d'un groupby. Je trierais par ordre décroissant votre colonne B, puis déposerais les doublons dans la colonne A et si vous le souhaitez, vous pouvez également avoir un nouvel index agréable et propre comme celui-ci:
la source
Voici une variante que j'ai dû résoudre et qui mérite d'être partagée: pour chaque chaîne unique dans,
columnA
je voulais trouver la chaîne associée la plus courante danscolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
Il en
.any()
choisit un s'il y a égalité pour le mode. (Notez que l'utilisation.any()
sur une série deint
s renvoie un booléen plutôt que d'en choisir un.)Pour la question d'origine, l'approche correspondante se simplifie en
df.groupby('columnA').columnB.agg('max').reset_index()
.la source
Lorsque des messages déjà donnés répondent à la question, j'ai fait un petit changement en ajoutant le nom de la colonne sur laquelle la fonction max () est appliquée pour une meilleure lisibilité du code.
la source
Façon la plus simple de le faire:
la source
cela fonctionne également:
la source
Je ne vais pas vous donner la réponse complète (je ne pense pas que vous cherchiez de toute façon l'analyse et l'écriture dans le fichier), mais un indice pivot devrait suffire: utilisez la
set()
fonction de python , puissorted()
ou.sort()
couplé avec.reverse()
:la source