Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大熊猫分组中的条件计数_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 大熊猫分组中的条件计数

Python 大熊猫分组中的条件计数,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据框,它有股票行情和各种日期的模型精度,如下所示: 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.2

我有一个数据框,它有股票行情和各种日期的模型精度,如下所示:

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%的百分比

我用

要获得平均准确度,但不确定是否有一种干净的方法来计算某个特定股票代码的准确度高于20%、50%的次数。

尝试以下方法:

dfGrouped.where(dfGrouped.Accuracy < 0.20).Accuracy.count()
dfGrouped.where(dfGrouped.accurity<0.20).accurity.count()
与计算词典一起使用:

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

也许先过滤它:
dfGrouped=df[df.accurity>0.2].groupby(['tickers'))
非常优雅的解决方案!当我在末尾添加另一个列(如>0.7_pct)时,它会更改res数据帧中列的顺序。顺序变为0.7,平均值,0.2,0.5。有没有办法在操作本身中指定顺序?@bloodynri,当然,请参阅更新。您可以使用
collections.OrderedDict
。这段代码为我节省了数小时的繁琐操作。非常感谢你!
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