Comment puis-je trouver toutes les lignes dans une trame de données pandas qui ont la valeur maximale pour la count
colonne, après le regroupement par ['Sp','Mt']
colonnes?
Exemple 1: le dataFrame suivant, que je regroupe ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Sortie attendue: obtenez les lignes de résultat dont le nombre est maximum entre les groupes, comme:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Exemple 2: cette trame de données, que je regroupe ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Pour l'exemple ci-dessus, je veux obtenir toutes les lignes où count
est égal à max, dans chaque groupe, par exemple:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
la source
la source
1 3
?Réponses:
Pour obtenir les indices du DF d'origine, vous pouvez faire:
Notez que si vous avez plusieurs valeurs max par groupe, toutes seront retournées.
Mettre à jour
Sur une grêle marie chance que c'est ce que le PO demande:
la source
idx
approche. Mais, je ne peux me permettre qu'un seul maximum pour chaque groupe (et mes données ont quelques duplicata max). existe-t-il un moyen de contourner ce problème avec votre solution?transform
La méthode peut avoir des performances de pool lorsque l'ensemble de données est suffisamment grand, obtenez d'abord la valeur maximale puis fusionnez les trames de données sera meilleure.Vous pouvez trier le dataFrame par nombre, puis supprimer les doublons. Je pense que c'est plus simple:
la source
inplace = True
comme argument pourdrop_duplicates
Une solution simple serait d'appliquer: la fonction idxmax () pour obtenir des indices de lignes avec des valeurs max. Cela filtrerait toutes les lignes avec une valeur maximale dans le groupe.
la source
"I want to get ALL the rows where count equals max in each group"
, tout en étantidxmax
Return[s] index of first occurrence of maximum over requested axis"
selon la documentation (0,21).Après avoir essayé la solution suggérée par Zelazny sur un DataFrame relativement grand (~ 400k lignes), je l'ai trouvé très lent. Voici une alternative que j'ai trouvée pour exécuter des ordres de grandeur plus rapidement sur mon ensemble de données.
la source
df[df['count'] == df['count_max']]
fera perdre des lignes NaN, ainsi que les réponses ci-dessus.Vous n'aurez peut-être pas besoin de faire avec le groupe en utilisant
sort_values
+drop_duplicates
Également presque la même logique en utilisant
tail
la source
Pour moi, la solution la plus simple serait de conserver la valeur lorsque le nombre est égal au maximum. Par conséquent, la commande d'une ligne suivante suffit:
la source
Utilisation
groupby
etidxmax
méthodes:transférez col
date
àdatetime
:récupère l'index
max
de la colonnedate
, aprèsgroupyby ad_id
:obtenir les données souhaitées:
Sortie [54]:
la source
la source
Réaliser que "appliquer" "nlargest" à un objet groupby fonctionne aussi bien:
Avantage supplémentaire - peut également récupérer les valeurs n supérieures si nécessaire:
la source
Essayez d'utiliser "nlargest" sur l'objet groupby. L'avantage de l'utilisation de nlargest est qu'il renvoie l'index des lignes à partir desquelles "les éléments nlargest" ont été récupérés. Remarque: nous coupons le deuxième (1) élément de notre indice puisque notre index dans ce cas est constitué de tuples (par exemple (s1, 0)).
entrez la description de l'image ici
la source
J'utilise ce style fonctionnel pour de nombreuses opérations de groupe:
.reset_index(drop=True)
vous ramène à l'index d'origine en supprimant l'index de groupe.la source