2017-10-03 4 views
2

Ich habe folgenden Datenrahmen:Reihen mit unterschiedlichen aufeinanderfolgenden Werten in Datenrahmen mit 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]}) 

Mein Ziel ist es, alle Zeilen zu entfernen, mit 2 aufeinanderfolgenden Werten von Spalte M nicht gleich zueinander ist.

Daher sollten Zeile 0, 1 und 2 entfernt werden, da die Werte von M sind: 11! = 4, 4! = 9 und 9! = 2). Wenn jedoch 2 Zeilen den gleichen fortlaufenden Wert haben, muss der Wert beibehalten werden: Zeile 3 und 4 müssen beibehalten werden, da beide Wert 2 haben. Gleiche Argumentation für Zeile 5 und 6 mit Wert 5.

Ich konnte meine Ziel durch Verwendung der folgenden Codezeilen:

Können Sie einen intelligenteren und besseren Weg vorschlagen, um mein Ziel zu erreichen? vielleicht mit einigen eingebauten Pandas-Funktion? Hier

ist, was der Datenrahmen aussehen soll:

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 

Antwort

3

Verwenden boolean indexing mit mask s von shift erstellt:

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

Durch die Verwendung von 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 

Hinweis Zurück kann man nicht funktionieren. (wenn 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() 

Eine weitere nette Antwort von MAXU:

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

was ist. 'Df.loc [df.M.diff() eq (0) | df.M.diff (-1) .eq (0)] '? – MaxU

+0

@MaxU Schöne Lösung, fügen Sie als Antwort Kerl ~ :) – Wen

+0

wäre es ähnlich wie Ihre und jezraels ... Bitte zögern Sie nicht, es zu Ihrer Antwort hinzufügen ;-) – MaxU

Verwandte Themen