2017-08-11 335 views
-1

我想计算'01'后的平均值(时间间隔为5分钟)。什么是最好的方式来做到这一点?如何计算groupby并在Python中应用后的平均值?

我已经汇总了以5分钟为间隔记录的数据。我想计算一段时间内的平均值。这里是示例数据集。

  captureTime id   digits 
0 2017-06-26 09:00:00 4015 558460648326103043  
1 2017-06-26 09:05:00 4015 13721946658181148 
2 2017-06-26 09:10:00 4015 288298648959188992  
3 2017-06-26 09:15:00 4015 27023247031744576  
4 2017-06-26 09:20:00 4015  435887716434584 
5 2017-06-26 09:25:00 4015   2147614720 
6 2017-06-26 09:00:00 4014 558451851700273155  
7 2017-06-26 09:05:00 4014 13721941188808728  
8 2017-06-26 09:10:00 4014 288263395867623424  
9 2017-06-26 09:15:00 4014 18016047776938080  
10 2017-06-26 09:20:00 4014  145547927225032  
11 2017-06-26 09:25:00 4014   3221356544 

这里是我当前的代码:

df_onoff = df_sample.groupby('id')['digits'].apply(lambda nums: "%d" % ', '.join(format(n%2**60,'060b') for n in nums).count('01')).reset_index(name='onoff') 

而这里的df_onoff的输出:

0 34 
1 36 
+0

那么你在寻找一个比你有更好的解决方案吗? – otayeby

+0

我看到你的输出,但我很困惑你想要什么。输出不是你想要的吗? – BenT

+0

@tiba我没有计算出平均值。 – ejshin1

回答

0

我有点困惑,你想要什么准确,其中“01的到来进入这个问题。也许你可以让你的问题更清楚你到底需要什么。第一步可能是按时间格式对数据进行分组,然后采取平均值。

df_sample.groupby('captureTime').mean() 
0

像其他人一样,我对你想要的东西有点困惑。

您的输出是01代码的总和,每组代码为id,而不是平均值。你在上一个陈述中表达得太多,这有点难以理解。为什么不简单明了?

你可以先预处理数据:

(1)输入

data=[ 
    ['2017-06-26 09:00:00',4015,558460648326103043], 
    ['2017-06-26 09:05:00',4015,13721946658181148], 
    ['2017-06-26 09:10:00',4015,288298648959188992], 
    ['2017-06-26 09:15:00',4015,27023247031744576], 
    ['2017-06-26 09:20:00',4015,435887716434584], 
    ['2017-06-26 09:25:00',4015,2147614720], 
    ['2017-06-26 09:00:00',4014,558451851700273155], 
    ['2017-06-26 09:05:00',4014,13721941188808728], 
    ['2017-06-26 09:10:00',4014,288263395867623424], 
    ['2017-06-26 09:15:00',4014,18016047776938080], 
    ['2017-06-26 09:20:00',4014,145547927225032], 
    ['2017-06-26 09:25:00',4014,3221356544] 
] 
df = pd.DataFrame(data, columns=['captureTime', 'id', 'digits']) 
# convert datetime 
df['captureTime'] = pd.to_datetime(df.captureTime) 
""" 

(2)计数'01'digits

df['counts01'] = df.digits.apply(
       lambda x:format(x%2**60,'060b').count('01')) 
# output 
      captureTime id    digits counts01 
0 2017-06-26 09:00:00 4015 558460648326103043   8 
1 2017-06-26 09:05:00 4015 13721946658181148   9 
2 2017-06-26 09:10:00 4015 288298648959188992   4 
3 2017-06-26 09:15:00 4015 27023247031744576   5 
4 2017-06-26 09:20:00 4015  435887716434584   8 
5 2017-06-26 09:25:00 4015   2147614720   2 
6 2017-06-26 09:00:00 4014 558451851700273155   8 
7 2017-06-26 09:05:00 4014 13721941188808728   8 
8 2017-06-26 09:10:00 4014 288263395867623424   4 
9 2017-06-26 09:15:00 4014 18016047776938080   4 
10 2017-06-26 09:20:00 4014  145547927225032   8 
11 2017-06-26 09:25:00 4014   3221356544   2 

现在你可以将任何类型的聚合功能。

(1)如果要为每个id平均值:

df.groupby('id')['counts01'].mean() 
#output 
id 
4014 5.666667 
4015 6.000000 

为了您的最后声明中,equvanient是:

In [27]: df.groupby('id')['counts01'].sum() 
Out[27]: 
id 
4014 34 
4015 36 
Name: counts01, dtype: int64 

显然,这是每个id组总和。 (2)我不明白你是什么意思'我想计算时间的平均值'。如果你想随着时间的推移进行聚合,你可以先生成一个时间序列(pd.date_range),然后按照这个时间序列进行分组。

谢谢。

+0

我需要应用总和的原因是指以下内容。假设我们有0110,1000,1110.由于每个数字都是一个事件,我将连接所有数字011010001110然后计数'01',否则我在0110和1110之间丢失'01'。同样,如果我不连接1000和1110,我会在两者之间失去一个'01'。“01”计数的总和应为3,平均值应为1。 – ejshin1