【发布时间】:2019-07-11 13:30:40
【问题描述】:
从使用 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, Device] 并找到它们的 Result 百分比,即 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
我得到了我想要的东西,但它看起来非常丑陋且效率低下。但是用我的 知识有限,我必须快速找到一些东西并且它有效。想要 以更好、更简单的方式实现这一目标。 注意:结果可能无法完全复制,因为我剪切粘贴了一个小 部分代码和结果来解释我想要什么以及我是如何(糟糕地)做到的。
【问题讨论】:
-
您可以使用均值来计算百分比....
df.groupby(['BldgID', 'Device'])['Result'].apply(lambda x : (x=='OK').mean())这有效吗?