计算数据框中连续值的百分比是否相同

时间:2018-06-17 12:07:36

标签: python pandas series

动机

我的数据框包含来自各种传感器的时间序列,记录:温度,湿度,紫外线辐射等。

有时传感器会被卡住"这意味着我会一次又一次地采用相同的测量方法。

例如:

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
  • 你可以看到在第3行,温度传感器卡在37.1上5行,最后6行的湿度卡在21.1上。
  • 让我们定义" Stuck"因为价值重复了更多的X时间(在5-20范围内,还不确定)。

如何计算每一行中"卡住的百分比"数据?

例如,最后一个示例中的输出应为:

temp = 5/13 * 100 = 38%
humidity = 6/13 * 100 = 46%

我可以做到"手动"通过使用2 for for循环,我确信使用pandas有更好的方法。

由于

3 个答案:

答案 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