我有一个包含行(有时数千(数据df
,对应于数字信号。我使用以下方法添加了额外的列:
df['On/Off'] = np.where(df[col] > value, 'On', 'Off')
将信号标记为打开或关闭(根据信号源设置value
(。以下代码给出了一个示例数据帧,尽管没有实际的测量数据:
df = pd.DataFrame({"Time/s" : np.arange(0,100,2),
"On/Off" : ("Off")})
df.at[10:13,"On/Off"] = "On"
df.at[40:43,"On/Off"] = "On"
df.at[47:,"On/Off"] = "On"
我想计算信号注册为打开的次数。对于上面的代码,结果将是 2(理想情况下返回索引(。
考虑到数据帧的组织方式,我认为沿着行向下并查找行对,其中第on/off
列在row n
处读作"关闭",然后在row_n+1
处读作"on"应该是这种方法,如下所示:
i =0 # <--- number of on/off pairings
if cycle = [row_n]='On'; [row_n+1]='Off':
i=+1
我目前的计划来自对此的答案(熊猫迭代数据帧行对(
我认为df.shift()
提供了一条潜在的路线,生成 2 个数据帧,然后比较行是否存在不匹配,但它觉得可能有一种更简单的方法,可能使用 itertools 或 pd.iterrows(等(。
像往常一样,任何帮助都非常感谢。
将shift
与eq
(==( 一起使用以比较值,将布尔掩码和最后计数True
s 按sum
链接:
out = (df['On/Off'].shift(-1).eq('Off') & df['On/Off'].eq('On')).sum()
另一种解决方案:
out = (df['On/Off'].shift().eq('On') & df['On/Off'].eq('Off')).sum()
print (out )
2
细节:
print ((df['On/Off'].shift().eq('On') & df['On/Off'].eq('Off')))
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 True
15 False
16 False
17 False
18 False
19 False
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 False
28 False
29 False
30 False
31 False
32 False
33 False
34 False
35 False
36 False
37 False
38 False
39 False
40 False
41 False
42 False
43 False
44 True
45 False
46 False
47 False
48 False
49 False
Name: On/Off, dtype: bool