在熊猫数据帧中查找相邻行的开/关信号或值对



我有一个包含行(有时数千(数据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(等(。

像往常一样,任何帮助都非常感谢。

shifteq(==( 一起使用以比较值,将布尔掩码和最后计数Trues 按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

最新更新