下面的代码:
data={'id':[1,2,3,4,5,6,7,8,9,10,11],
'value':[1,0,1,0,1,1,1,0,0,1,0]}
df=pd.DataFrame.from_dict(data)
df
Out[8]:
id value
0 1 1
1 2 0
2 3 1
3 4 0
4 5 1
5 6 1
6 7 1
7 8 0
8 9 0
9 10 1
10 11 0
我想创建一个标志列,用从第二次出现开始的1个连续值表示,并忽略第一次出现。
使用实际解决方案:
df['flag'] =
df.value.groupby([df.value,df.flag.diff().ne(0).cumsum()]).transform('size').ge(3).astype(int)
Out[8]:
id value flag
0 1 1 0
1 2 0 0
2 3 1 0
3 4 0 0
4 5 1 1
5 6 1 1
6 7 1 1
7 8 0 1
8 9 0 1
9 10 1 0
10 11 0 0
虽然我需要这样的解决方案,其中第一个示例从第二个示例开始标记为0和1:
Out[8]:
id value flag
0 1 1 0
1 2 0 0
2 3 1 0
3 4 0 0
4 5 1 0
5 6 1 1
6 7 1 1
7 8 0 0
8 9 0 1
9 10 1 0
10 11 0 0
2条答案
按热度按时间lskq00tm1#
通过比较
Series.shift
与不相等和Series.cumsum
的值来创建连续组,通过GroupBy.cumcount
创建计数器,并比较0
与Series.gt
之间的较大值,最后通过Series.astype
强制转换为整数来将True, False
Map到1, 0
:工作原理:
yptwkmov2#
使用
groupby.cumcount
和自定义grouper:跳过第一个
N
的通用代码:输出: