簡體   English   中英

帶有動態列的Pandas Groupby Countif

[英]Pandas groupby countif with dynamic columns

我有一個具有以下結構的數據框:

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地址的事件數。 我需要一個數據框,其中每個礦工有20分鍾的時間段發生了0個事件,我需要從中得出IP“正常運行時間”的百分比。 IP地址的數量是動態的。 所需的輸出:

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

我已經嘗試了groupby,agg和lambda,但無濟於事。 通過動態列執行“計數”的最佳方法是什么?

您可以通過條件df == 0使用布爾值掩碼的summean 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

移置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())

出於審美目的:

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

圖片

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM