想要为列中的一系列 0 生成一个计数器
Want to generate a counter for a series of 0s in a column
为了清楚说明我的数据有温度值,当传感器没有记录任何值时,它会给出连续的 0。我的时间间隔以毫秒为单位,每次都会给我一串 0。当一串 0 出现时,我希望计数器从 1 增加到 2 再到 3 等等。
本质上,我想要如下所示的计数器列
No.
Temp
Count
1
80.0
0
2
81.6
0
3
0.00
0
4
0.00
0
5
0.00
0
6
81.6
1
7
80.0
0
8
83.7
0
9
0.00
0
10
0.00
0
11
0.00
0
12
81.6
1
13
81.6
0
14
80.0
0
15
83.7
0
16
0.00
0
17
0.00
0
18
0.00
0
19
81.6
1
我在想
df['count'] = df.groupby((df['col'] == df['col'].shift(2)).cumsum()).cumcount()+1
但必须有更简单的方法。此外,如果我的温度值恰好符合此逻辑,这可能会造成混乱。
您可以使用简单的布尔值来跟踪最后一个值是否为零,并在值停止变为零时递增计数器。
我看到您使用了 PANDAS df,但由于您的问题说您将使用实时数据,所以我决定保持代码不明确,以便您可以将其应用到您自己的用例中。
您可以放置连接到传感器的逻辑,而不是使用 for
循环遍历列表。当然你可以把底部的打印语句替换成任何你需要的。
nums = [80.0, 81.6, 0.0, 0.0, 0.0, 81.6, 80.0, 83.7, 0.0, 0.0, 0.0, 81.6]
zeroCount = 1
isZero = False
for num in nums: #Can be whatever type of iteration you need
if num == 0:
isZero = True
if isZero:
if num != 0:
zeroCount += 1
isZero = False
print("%.1f %d" % (num, zeroCount))
运行 该代码生成您在问题中列出的输出:
80.0 1
81.6 1
0.0 1
0.0 1
0.0 1
81.6 2
80.0 2
83.7 2
0.0 2
0.0 2
0.0 2
81.6 3
为了清楚说明我的数据有温度值,当传感器没有记录任何值时,它会给出连续的 0。我的时间间隔以毫秒为单位,每次都会给我一串 0。当一串 0 出现时,我希望计数器从 1 增加到 2 再到 3 等等。
本质上,我想要如下所示的计数器列
No. | Temp | Count |
---|---|---|
1 | 80.0 | 0 |
2 | 81.6 | 0 |
3 | 0.00 | 0 |
4 | 0.00 | 0 |
5 | 0.00 | 0 |
6 | 81.6 | 1 |
7 | 80.0 | 0 |
8 | 83.7 | 0 |
9 | 0.00 | 0 |
10 | 0.00 | 0 |
11 | 0.00 | 0 |
12 | 81.6 | 1 |
13 | 81.6 | 0 |
14 | 80.0 | 0 |
15 | 83.7 | 0 |
16 | 0.00 | 0 |
17 | 0.00 | 0 |
18 | 0.00 | 0 |
19 | 81.6 | 1 |
我在想
df['count'] = df.groupby((df['col'] == df['col'].shift(2)).cumsum()).cumcount()+1
但必须有更简单的方法。此外,如果我的温度值恰好符合此逻辑,这可能会造成混乱。
您可以使用简单的布尔值来跟踪最后一个值是否为零,并在值停止变为零时递增计数器。
我看到您使用了 PANDAS df,但由于您的问题说您将使用实时数据,所以我决定保持代码不明确,以便您可以将其应用到您自己的用例中。
您可以放置连接到传感器的逻辑,而不是使用 for
循环遍历列表。当然你可以把底部的打印语句替换成任何你需要的。
nums = [80.0, 81.6, 0.0, 0.0, 0.0, 81.6, 80.0, 83.7, 0.0, 0.0, 0.0, 81.6]
zeroCount = 1
isZero = False
for num in nums: #Can be whatever type of iteration you need
if num == 0:
isZero = True
if isZero:
if num != 0:
zeroCount += 1
isZero = False
print("%.1f %d" % (num, zeroCount))
运行 该代码生成您在问题中列出的输出:
80.0 1
81.6 1
0.0 1
0.0 1
0.0 1
81.6 2
80.0 2
83.7 2
0.0 2
0.0 2
0.0 2
81.6 3