首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >一种更有效的百分比计算方法

一种更有效的百分比计算方法
EN

Stack Overflow用户
提问于 2019-07-11 13:30:40
回答 1查看 109关注 0票数 0

在使用groupby之后,从数据帧中识别成功/不成功的比率。由于我对Python和pandas的了解有限,虽然我做到了,但看起来效率低下且笨拙。一定有一些更简单有效的方法。任何帮助都将不胜感激。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BldgID  BldHt   Device  Date      Time     Result
1213    35      758     20181120  105550   OK
1213    35      758     20181120  105540   NG
1112    40      780     20181120  003102   OK
1117    26      790     20181120  002557   OK
1111    65      780     20181120  002102   NG
1214    80      758     20181120  001600   OK
2902    34      780     20181119  005410   OK
1232    90      780     20181119  001410   OK
1222    75      760     20181119  010552   OK
1214    80      758     20181119  010052   OK
1214    80      758     20181119  005553   NG
1246    16      790     20181119  004556   OK
1128    15      758     20181119  004552   OK
1128    15      758     20181119  004552   OK
1211    30      790     20181119  003557   NG
1211    30      790     20181119  003558   OK

这是数据帧(csv)。首先,我想对BldgID、BldHt、设备进行分组,并找出它们的结果百分比,即OK/OK+NG。我所做的是,将“OK”更改为“1”,将“NG”更改为“0”。把所有的“OK”加起来。为了找到总数(OK+NG),我在更改它们的值(1 & 0)之前使用了数据帧,并计算了总数。否则,它不会计算将它们相除的NGThen,以得出“OK”的百分比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("data.csv")
df1 = df.groupby(['BldgID','Device'])['Result'].agg('sum').reset_index()
df1 = df.replace({'OK':1, 'NG': 0})
df1 = df1.groupby(['BldgID','Device'])['Result'].agg('sum').reset_index()
df1['NumOKs'] = df1['Result']

# used the original df i.e. change OK=1, NG=0, to count the total num of
# OK+NG
df2 = df.groupby(['BldgID','Device']) 
         ['Result'].agg('count').reset_index()

df2['sum'] = mel_df2['Result']
df2.drop(['Result'], axis=1, inplace=True)

df3 = pd.concat([df1['NumOKs'], df2['sum']], axis=1, keys= 
['NumOKs','sum'])

df3.head(10)
# sum represents OK+NG
       NumOKs     sum
 0       2        2
 1       6        6
 2       2        2
 3       2        2
 4       2        2
 5       3        4
 6       3        3
 7       3        3
 8       2        3
 9       3        3

我得到了我想要的,但它看起来非常丑陋和低效。但是,以我有限的知识,我必须找到一些快速的东西,它是有效的。我想以一种更好更简单的方式来实现这一点。注意:当我剪切粘贴一小部分代码和结果来解释我想要什么以及我是如何(糟糕地)做的时候,结果可能不会被准确地重现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 13:43:36

IIUC,尝试使用mean和布尔条件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.groupby(['BldgID', 'Device'])['Result'].apply(lambda x : (x=='OK').mean())

要将此内容添加到数据帧中,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df['mean_ok'] = df.groupby(['BldgID', 'Device'])['Result']\
                  .apply(lambda x : (x=='OK').mean())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56990425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文