2017-10-20 98 views
2

我想標記列表中的重複序列。如何在熊貓中標記'重複序列'?

例如:

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

我預期的結果是:

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

我試過pandas.DataFrame.duplicated(keep=False),但複製它標誌着 '2':

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

如何紀念'重複序列'只?

回答

2

你需要shiftcumsum幫手Series其中適用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] 

詳細信息:。

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

我試過這個解決方案,它的工作原理! cumsum()是有趣的方式。你的解決方案打開我的腦海熊貓是一個真正強大的工具。 謝謝! –

1

您可以使用shift

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

或由於@Zero

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

print tuple(mask) 

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

如果您有序列在比較兩個口罩年底將是有益的,即

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

或者's.diff()bfill()EQ(0)' – Zero

+0

謝謝,它的工作原理。 s == s.shift()。bfill()是一個好主意。作爲熊貓的新手,它激發了我如何在矩陣計算中思考。再次感謝。 –

+0

去@ jez解決方案適合所有情況 – Dark