2016-10-13 33 views
2

で私はこのような構造を持つデータフレームを持っている:パンダGROUPBY COUNTIF動的な列

time,10.0.0.103,10.0.0.24 
2016-10-12 13:40:00,157,172 
2016-10-12 14:00:00,0,203 
2016-10-12 14:20:00,0,0 
2016-10-12 14:40:00,0,200 
2016-10-12 15:00:00,185,208 

それは与えられた20分間の期間、IPアドレスごとのイベントの数を詳述します。私は、鉱夫1人あたり20分の間に何回のイベントが発生したかというデータフレームが必要です。そこからIPの稼働時間をパーセントで求める必要があります。 IPアドレスの数は動的です。望ましい出力:

IP,noEvents,uptime 
10.0.0.103,3,40 
10.0.0.24,1,80 

私はgroupby、agg、lambdaを無駄にしようとしました。動的な列によって「カウント」を行う最善の方法は何ですか?

+0

10.0.0.103'事故のない3つの期間(5つのうち)があり、稼働時間が60%になるべきではないか? – unutbu

+0

さて、はい。私の悪い。 – user6949779

答えて

3

ブール値マスクのsummeanを条件df == 0で使用できます。最終concat両方Series

df.set_index('time', inplace=True) 
mask = (df == 0) 
print (mask) 
        10.0.0.103 10.0.0.24 
time          
2016-10-12 13:40:00  False  False 
2016-10-12 14:00:00  True  False 
2016-10-12 14:20:00  True  True 
2016-10-12 14:40:00  True  False 
2016-10-12 15:00:00  False  False 

noEvents = mask.sum() 
print (noEvents) 
10.0.0.103 3 
10.0.0.24  1 
dtype: int64 

uptime = 100 * mask.mean() 
print (uptime) 
10.0.0.103 60.0 
10.0.0.24  20.0 
dtype: float64 

print (pd.concat([noEvents, uptime], axis=1, keys=('noEvents','uptime')) 
     .reset_index() 
     .rename(columns={'index':'IP'})) 

      IP noEvents uptime 
0 10.0.0.103   3 60.0 
1 10.0.0.24   1 20.0 
2

DFトランスポーズ:

df = df.T 

あなたがgroupbyを使用しての線に沿ってみましたので、あなたがさらに積層した後、すべてのグループでのゼロの数を取得するためにvalue_countsを使用して進めることができそれはseriesオブジェクトを生成し、後で図のようにDFにアンスタックします。

grp = df.stack().to_frame('val').groupby(level=0)['val'] 
df['noEvents'] = grp.value_counts().unstack()[0] 

その後、それは割合の分布です取得するには、そのグループのサイズと値を分割:美的目的のために

df['upTime'] = (100*df['noEvents']/grp.size()) 

:鉱夫IP場合 `

df = df[['noEvents', 'upTime']].astype(int) 
df.index.name = 'IP' 
df.columns.name = None 
df 

Image