首页 > 解决方案 > Groupby Pandas 中的条件计数

问题描述

我有一个数据框,其中包含股票代码和各种日期的模型准确性,如下所示:

ZAYO  20170228  0.203997
ZAYO  20170531  0.180037
ZAYO  20170831  0.110623
ZBH   20170131  0.130060
ZBH   20170430  0.115384
ZBH   20170731  0.065990
AAAP  20170331  1.075765
AAAP  20170630  1.119365
AAAP  20170930  0.223602
AAL   20170131  0.338255
AAL   20170430  0.386442
AAL   20170731  0.171351

我想创建一个摘要数据框,其中每行包含代码名称、平均准确度、准确度高于 20 的时间百分比、准确度高于 50% 的时间百分比。

我用

dfGrouped = df.groupby(['tickers'])
dfGrouped.Accuracy.mean()

获得平均准确度,但不确定一种干净的方法来计算特定代码的准确度超过 20%、50% 的次数。

标签: pythonpandasdataframepandas-groupby

解决方案


groupby.agg与计算字典一起使用:

from collections import OrderedDict

df.columns=['ticker', 'date', 'accuracy']

groupers = OrderedDict([('mean', np.mean),
                        ('>_0.20_pct', lambda x: (x > 0.20).sum()/len(x)),
                        ('>_0.50_pct', lambda x: (x > 0.50).sum()/len(x)),
                        ('>_0.70_pct', lambda x: (x > 0.70).sum()/len(x))])

res = df.groupby('ticker')['accuracy'].agg(groupers)

print(res)

            mean  >_0.20_pct  >_0.50_pct  >_0.70_pct
ticker                                              
AAAP    0.806244    1.000000    0.666667    0.666667
AAL     0.298683    0.666667    0.000000    0.000000
ZAYO    0.164886    0.333333    0.000000    0.000000
ZBH     0.103811    0.000000    0.000000    0.000000

推荐阅读