2017-10-20 109 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