1
votes

comment obtenir tous les enregistrements après le minimum dans pandas dataframe

Comment obtenir tous les enregistrements (après la valeur minimale)

ex: la valeur minimale est 7, je veux obtenir tous les enregistrements après.

min1=dfs[i].loc[dfs[i]['Value'] == dfs[i]['Value'].min()]['Date'].values[0]
dfs[i][min1:]

J'ai essayé

Date             Value    
2020-03-11       20 
2020-02-25       10
2020-02-20       7.5      
2020-02-15       7        
2020-01-10       10       
2019-12-07       15       

mais cela a généré une erreur 'TypeError: impossible de faire une indexation de tranche avec ces indexeurs [2020-02-12T00: 00: 00.000000000] de'

Remarque: j'ai une liste de blocs de données.


2 commentaires

df.loc [[df ['value']. ​​idxmin ()] :,] Cela devrait vous donner toutes les valeurs après le minimum


Impossible de modifier le commentaire précédent, donc publier à nouveau la réponse après avoir corrigé le crochet supplémentaire ici df.loc [df ['value']. ​​Idxmin () :,]


3 Réponses :


1
votes

Vous voulez utiliser shift pour obtenir la série décalée, puis comparez cela avec min:

4    10.0
Name: Value, dtype: float64

Sortie: p >

df.loc[df.Value.shift()==df.Value.min(), 'Value']

Si vous voulez juste obtenir Valeur:

         Date  Value
4  2020-01-10   10.0

Sortie:

df[df.Value.shift()==df.Value.min()]


0 commentaires

2
votes

Vous pouvez obtenir toutes les lignes après le premier minimum en procédant ainsi

df.loc [df ['Value']. ​​idxmin () :,]

EDIT: Basé sur le commentaire ci-dessous pour obtenir des lignes après le minimum, sans inclure le minimum df.loc [df ['Value']. ​​idxmin () + 1 :,]

Veuillez noter que je suppose que l'index est un entier continu, sinon veuillez réinitialiser l'index. Si votre index n'est pas entier et non monotone, veuillez vérifier la réponse @Valdi_Bo ci-dessous


2 commentaires

Cette expression récupère les lignes à partir de la ligne "minimale", alors que l'OP veut des lignes après cette ligne.


Merci beaucoup, c'est exactement ce que je cherchais.



2
votes

Supposons que le DataFrame contienne:

df.loc[df.Value.shift().idxmin():]

Pour prouver que ma méthode fonctionne dans tous les cas possibles, j'ai délibérément a choisi un index non numérique et non monotone, mais l'index doit être unique.

Notez que:

  1. idxm = df.Value.idxmin () obtient l'index de la ligne avec un minimum Valeur - C4.

  2. df.loc [: idxm] .index récupère la partie "initiale" de l'index, jusqu'à la ligne "minimale" (y compris) - Index (['A1', 'H2', 'E3', 'C4'], dtype = 'object') .

  3. df.index.difference (df.loc [: idxm] .index) récupère l'autre partie de l'index - Index (['B5', 'M6'], dtype = 'object') .

Cela conduit donc à la conclusion que la bonne expression est:

          Date  Value
B5  2020-01-10   10.0
M6  2019-12-07   15.0

Le résultat de cette expression est:

df.loc[df.index.difference(df.loc[:idxm].index)]


1 commentaires

Merci beaucoup, cela m'a aidé à trouver la solution. J'ai fait un petit changement `df.loc [df.index.difference (df.loc [idxm:]. Index)]` donc j'obtiens A1, H2 et E3.