编辑。
假设我在熊猫中有以下系列:
>>>p
0 0.0
1 0.0
2 0.0
3 0.3
4 0.3
5 0.3
6 0.3
7 0.3
8 1.0
9 1.0
10 1.0
11 0.2
12 0.2
13 0.3
14 0.3
15 0.3
我需要识别连续重复的每个序列 - 它的第一个和最后一个索引。使用上面的例子,我需要独立于0.3的最后一个序列(从索引13到15)识别0.3的第一个序列(从索引3到7)。
使用Series.duplicated是不够的,因为:
*使用keep =' first'将所有重复项的第一个实例标记为False,但将索引13保留为True,因为它不是0.3的第一个外观。
*同样适用于keep =' last'
* keep = False只是将所有条目标记为True。
谢谢!
答案 0 :(得分:2)
我认为比较shift
ed值需要诀窍,ne
与cumsum
和drop_duplicates
不相等:
s = df['a'].ne(df['a'].shift()).cumsum()
a = s.drop_duplicates().index
b = s.drop_duplicates(keep='last').index
df = pd.DataFrame({'first':a, 'last':b})
print (df)
first last
0 0 2
1 3 7
2 8 10
3 11 12
4 13 15
如果还希望将重复值复制到新列,则使用duplicated
进行位更改解决方案:
s = df['a'].ne(df['a'].shift()).cumsum()
a = df.loc[~s.duplicated(), 'a']
b = s.drop_duplicates(keep='last')
df = pd.DataFrame({'first':a.index, 'last':b.index, 'val':a})
print (df)
first last val
0 0 2 0.0
3 3 7 0.3
8 8 10 1.0
11 11 12 0.2
13 13 15 0.3
如果需要新栏目:
df['count'] = df['a'].ne(df['a'].shift()).cumsum()
print (df)
a count
0 0.0 1
1 0.0 1
2 0.0 1
3 0.3 2
4 0.3 2
5 0.3 2
6 0.3 2
7 0.3 2
8 1.0 3
9 1.0 3
10 1.0 3
11 0.2 4
12 0.2 4
13 0.3 5
14 0.3 5
15 0.3 5