2017-10-03 1 views
2

je l'dataframe suivante:Supprimez des lignes ayant des valeurs consécutives à l'aide dataframe Pandas

import pandas as pd 
df = pd.DataFrame({"A":['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'], "M":[11,4,9,2,2,5,5,6,6]}) 

Mon but est de supprimer toutes les lignes ayant 2 valeurs consécutives de la colonne M pas égales entre elles.

Par conséquent, les lignes 0, 1 et 2 doivent être supprimées car les valeurs de M sont: 11! = 4, 4! = 9 et 9! = 2). Cependant, si 2 lignes ont la même valeur consécutive, elles doivent être conservées: les lignes 3 et 4 doivent être conservées car elles ont toutes les deux la valeur 2. Idem pour les lignes 5 et 6 qui ont la valeur 5.

but en utilisant les lignes de code suivantes:

l=[] 
for i, row in df.iterrows(): 
    try: 
     if df["M"].iloc[i]!=df["M"].iloc[i+1] and df["M"].iloc[i]!=df["M"].iloc[i-1]: 
      l.append(i) 
    except: 
     pass 
df = df.drop(df.index[l]).reset_index(drop=True) 

Pouvez-vous suggérer une façon plus intelligente et plus efficace d'atteindre mon objectif? peut-être en utilisant une fonction intégrée de pandas?

Voici ce que le dataframe devrait ressembler à:

Before: 
    A M 
0 a 11 <----Must be removed 
1 s 4 <----Must be removed 
2 d 9 <----Must be removed 
3 f 2 
4 g 2 
5 h 5 
6 j 5 
7 k 6 
8 l 6 

After 
    A M 
0 f 2 
1 g 2 
2 h 5 
3 j 5 
4 k 6 
5 l 6 

Répondre

3

Utilisation boolean indexing avec mask s créé par shift:

m = (df["M"].eq(df["M"].shift()) | df["M"].eq(df["M"].shift(-1))) 
#alternative 
#m = ~(df["M"].ne(df["M"].shift()) & df["M"].ne(df["M"].shift(-1))) 
print (df[m]) 
    A M 
3 f 2 
4 g 2 
5 h 5 
6 j 5 
7 k 6 
8 l 6 
3

En utilisant diff

df.loc[df.M.isin(df[df.M.diff()==0].M),:] 
Out[140]: 
    A M 
3 f 2 
4 g 2 
5 h 5 
6 j 5 
7 k 6 
8 l 6 

Avis précédent peut pas de travail. (quand 1,1,2,1,3,4)

m=df[df.M.diff()==0].index.values.tolist() 
m.extend([x-1 for x in m]) 
df.loc[set(m)].sort_index() 

Une autre belle réponse de MaxU:

df.loc[df.M.diff().eq(0) | df.M.diff(-1).eq(0)] 
+0

Qu'en est-:. 'Df.loc [df.M.diff() eq (0) | df.M.diff (-1) .eq (0)] '? – MaxU

+0

@MaxU Nice solution, ajouter que comme une réponse mec ~ :) – Wen

+0

il serait semblable à la vôtre et jezraels ... S'il vous plaît n'hésitez pas à l'ajouter à votre réponse ;-) – MaxU