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