只计算每个序列的第一次出现 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
我有一些加速度数据,如果 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