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

他の人のように、私はちょうどあなたが欲しいものについて少し混乱しています。

出力は、平均ではなく、idの各グループの01コードの合計です。あなたは最後の声明にあまりにも多くの表現を入れましたが、理解するのは少し難しいです。なぜそれを簡単で明瞭にしないのですか?

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)今、あなたはどのような種類の集計関数を適用することができます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 

ため'01'をカウント

(1)INPUT:

あなたが最初のデータを前処理することができます。

(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を失います。同様に、1000と1110を連結しないと、私はその間に「01」を失うだろう。'01'の合計は3で、平均は1でなければなりません。 – ejshin1

関連する問題