【问题标题】:Pandas groupby countif with dynamic columns带有动态列的 Pandas groupby countif
【发布时间】:2017-02-22 12:49:45
【问题描述】:

我有一个具有这种结构的数据框:

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,但均无济于事。通过动态列执行“countif”的最佳方法是什么?

【问题讨论】:

  • 如果矿工 IP10.0.0.103 有 3 个周期(共 5 个周期)没有事故,他的正常运行时间不应该是 60% 吗?
  • 嗯,是的。我的错。

标签: python pandas sum multiple-columns mean


【解决方案1】:

您可以通过条件df == 0 使用布尔掩码的summean。最后concatSeries

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 对象并随后将其解栈回@ 987654329@如图:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 2021-09-22
      • 2020-08-23
      • 1970-01-01
      • 2020-08-31
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多