在使用groupby之后,从数据帧中识别成功/不成功的比率。由于我对Python和pandas的了解有限,虽然我做到了,但看起来效率低下且笨拙。一定有一些更简单有效的方法。任何帮助都将不胜感激。
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”的百分比。
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
我得到了我想要的,但它看起来非常丑陋和低效。但是,以我有限的知识,我必须找到一些快速的东西,它是有效的。我想以一种更好更简单的方式来实现这一点。注意:当我剪切粘贴一小部分代码和结果来解释我想要什么以及我是如何(糟糕地)做的时候,结果可能不会被准确地重现。
发布于 2019-07-11 13:43:36
IIUC,尝试使用mean
和布尔条件:
df.groupby(['BldgID', 'Device'])['Result'].apply(lambda x : (x=='OK').mean())
要将此内容添加到数据帧中,请执行以下操作:
df['mean_ok'] = df.groupby(['BldgID', 'Device'])['Result']\
.apply(lambda x : (x=='OK').mean())
https://stackoverflow.com/questions/56990425
复制相似问题