2017-08-11 49 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