只计算每个序列的第一次出现 python

Count only first occurrence of each sequence python

我有一些加速度数据,如果 accelpos 列中的加速度值 >=2.5,我会使用以下代码设置一个新列以给出 1

frame["new3"] = np.where((frame.accelpos >=2.5), '1', '0')

我最终按这样的顺序获取数据

0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0

我想添加第二列以在每个序列的开头给出一个 1,如下所示

0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0

如有任何帮助,我们将不胜感激

您可以通过 Series.shift 比较移位值并仅获取 '1' 的值,因此通过 & 为按位 AND 链接条件,最后为 [= 转换为整数=18=] 到 1/0 映射:

df = pd.DataFrame({'col':'0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0'.split(',')})

df['new'] = (df['col'].ne(df['col'].shift()) & df['col'].eq('1')).astype(int)

或测试差异,但因为可能首先 1 是必要的,用 fillna:

替换原始值
s = df['col'].astype(int)
df['new'] = s.diff().fillna(s).eq(1).astype(int)

print (df)
   col  new
0    0    0
1    0    0
2    0    0
3    0    0
4    1    1
5    1    0
6    1    0
7    1    0
8    1    0
9    0    0
10   0    0
11   0    0
12   1    1
13   1    0
14   0    0
15   0    0
16   0    0
17   1    1
18   1    0
19   1    0
20   1    0
21   1    0
22   1    0
23   1    0
24   1    0
25   1    0
26   1    0
27   0    0
28   0    0
29   0    0
30   0    0

我不熟悉 where 函数。我想我可能会尝试从算法的角度提供帮助。

假设我们有一个列表a = [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, ..., 0]

从算法 POV 中,如果您想在此类序列的开头用一个唯一的序列替换 1 的每个序列,这就是您想要做的:

  • 解析列表
  • 判断是一还是零
  • 如果是 1,则后面的每一项都必须是 0,直到您实际得到一个 0

你可能想要这样的东西:

a = [0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1]

for i in range(len(a)-1):
    if a[i] == 1 :
        for j in range(1,len(a)-i):
            if a[i+j] == 1:
                a[i+j] = 0
            else :
                break