我目前正在使用Pandas 管理一个CSV文件,该文件包含 map 上船只位置的数据.我有一个Pandas 数据框,看起来像这样(简化后):
Index | Group | C_p |
---|---|---|
1 | 1 | 27 |
2 | 1 | 85 |
3 | 1 | 83 |
4 | 1 | 78 |
5 | 1 | 66 |
6 | 1 | 47 |
7 | 3 | 82 |
8 | 3 | 80 |
9 | 3 | 66 |
C_p是判断船舶是否停靠的置信度系数.
判断一艘停放的船只的方法如下:
如果一个数据序列的C_p平均值大于80
,则该数据序列为停泊的船只,且一个序列的最小个数大于3
.
所以在这个例子中,指数2到4是一个停靠的船只序列,因为C_p的平均值是82.67,高于80.尽管指数7到8,C_p的平均值在80以上,但该层序只有两个元素,因此这不是一艘停放的船只.
所以我想要得到这个:
Index | Group | C_p | is_parked |
---|---|---|---|
1 | 1 | 27 | 0 |
2 | 1 | 85 | 1 |
3 | 1 | 83 | 1 |
4 | 1 | 78 | 1 |
5 | 1 | 66 | 0 |
6 | 1 | 47 | 0 |
7 | 3 | 82 | 0 |
8 | 3 | 80 | 0 |
9 | 3 | 66 | 0 |
我try 将此方法更改为Leetcode问题,如下所示:
for i in range(n - 2): # n is the element number of a group
avg = (C_p[i] + C_p[i+1] + C_p[i+2]) / 3
if avg >= 80:
is_parked[i] = is_parked[i+1] = is_parked[i+2] = 1 # default value of is_parked is 0
但我不知道如何使用Pandas或Python来实现它.
所以我的问题是:
-
有没有办法在Pandas 身上实现这一点?
-
如果没有,我应该求助于Numpy或其他什么来获得结果吗?
编辑:1 S的 comments 让我对我的例子和方法进行了重新判断.
如果C_p[5]=78,它仍然是一艘停放的船只,并且它是按每组计算的.
我没有考虑到这一点,所以我的第一次try 是错误的. 这是我的新try
for i in range(n):
thisSUM = C_p[i]
for j in range(i+1, n):
thisSUM += C_p[j]
avg = thisSUM / (j - i + 1)
if avg >= 80 and j - i + 1 >= 3:
for k in range(i, j+1):
is_parked_check[k] = 1
时间复杂度为O(n^3),这是不好的.