2017-10-20 2 views
2

Ich möchte die doppelte Sequenz in einer Liste markieren.Wie markiert man 'doppelte Sequenz' in Pandas?

Zum Beispiel:

(1,1,1,0,2,3,2,4,2) 

Mein erwartetes Ergebnis ist:

(True,True,True,False,False,False,False,False,False) 

Ich versuchte pandas.DataFrame.duplicated(keep=False), aber es markiert '2' als verdoppelt:

(True,True,True,False,True,False,True,False,True). 

Wie das markieren 'duplizierte Sequenz' nur?

Antwort

2

Sie hilfreich sein Benötigen Sie shift mit cumsum für Helfer Series wo gelten duplicated:

s = pd.Series([1,2,1,1,2,3,3,2,4,2,2,1]) 
print (s.ne(s.shift()).cumsum().duplicated(keep=False).values) 
[False False True True False True True False False True True False] 

Detail:..

print (s.ne(s.shift()).cumsum()) 
0  1 
1  2 
2  3 
3  3 
4  4 
5  5 
6  5 
7  6 
8  7 
9  8 
10 8 
11 9 
dtype: int32 
+0

Ich habe diese Lösung versucht, es funktioniert! Cumsum() ist ein interessanter Weg. Deine Lösung öffnet meine Meinung. Pandas ist ein wirklich mächtiges Werkzeug. Danke! –

1

können Sie verwenden shift dh

s = pd.Series([1,1,1,0,2,3,2,4,2]) 
mask = (s == s.shift().bfill()) 

oder Dank @Zero

mask = s.diff().bfill().eq(0) 

print tuple(mask) 

(True, True, True, False, False, False, False, False, False) 

Falls Sie Sequenz am Ende den Vergleich von zwei Masken haben würde also

n = pd.Series([1,1,1,0,2,3,2,4,2,2]) 
mask = (n==n.shift(-1).ffill()) | (n==n.shift().bfill()) 

tuple(mask) 
(True, True, True, False, False, False, False, False, True, True) 
+1

Oder 's.diff() bfill() eq (0)' – Zero

+0

Danke, es funktioniert. s == s.shift(). Bfill() ist eine gute Idee. als eine neue Hand in Pandas, inspiriert es mich, in der Matrix Berechnung zu denken. Danke noch einmal. –

+0

Go for @ jez Lösung es passt für alle Fälle – Dark

Verwandte Themen