动机
我的数据框包含来自各种传感器的时间序列,记录:温度,湿度,紫外线辐射等。
有时传感器会被卡住"这意味着我会一次又一次地采用相同的测量方法。
例如:
temp humidity
36.4 20.2
36.2 21.1
37.1 22.0
37.1 22.2
37.1 22.1
37.1 22.3
37.1 22.2
36.2 21.1
36.3 21.1
36.1 21.1
36.4 21.1
36.4 21.1
36.2 21.1
如何计算每一行中"卡住的百分比"数据?
例如,最后一个示例中的输出应为:
temp = 5/13 * 100 = 38%
humidity = 6/13 * 100 = 46%
我可以做到"手动"通过使用2 for for循环,我确信使用pandas有更好的方法。
由于
答案 0 :(得分:1)
您可以使用itertools.groupby
定义一个函数来计算相同连续项的数量。然后按给定的最小计数进行过滤。
这是有效的,因为itertools.groupby
是一个O(n)解决方案,它对连续项进行分组,而不是在最后整体形成组。
from itertools import groupby
def get_stuck_count(x, n):
lens = (len(list(j)) for _, j in groupby(x))
return sum(i for i in lens if i >= n)
df_len = len(df.index)
temp_stuck_pct = get_stuck_count(df['temp'], 5) / df_len
humidity_stuck_pct = get_stuck_count(df['humidity'], 5) / df_len
print(temp_stuck_pct) # 0.38461538461538464
print(humidity_stuck_pct) # 0.46153846153846156
答案 1 :(得分:1)
In [582]: def get_stuck_pct(df, col, r=range(5,20)):
...: max_cnt = df.groupby((df[col] != df[col].shift()).cumsum()).size().max()
...: if max_cnt in r:
...: return '{}%'.format(int(max_cnt / df[col].size * 100))
...: return '0%'
...:
...:
In [583]: get_stuck_pct(df, 'temp')
Out[583]: '38%'
In [584]: get_stuck_pct(df, 'humidity')
Out[584]: '46%'
答案 2 :(得分:0)
在这里,您希望获得所有重复项,然后平均序列中最大出现次数的总和。
dup = df.temp.duplicated().astype(int)
lst = dup.groupby(dup.eq(0).cumsum()).cumsum().tolist()
print max(lst) / float(len(lst))
>>>0.384615384615