从使用groupby后的数据框中要确定成功/失败 率。尽管我对Python和熊猫的了解有限,但我看起来效率低下且笨拙。必须有一些更简单有效的方法。任何帮助将非常感激。
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。我做了什么 是,将“确定”更改为“ 1”,将“ NG”更改为“ 0”。总结所有的“确定”。找到 总数(OK + NG),我在更改其值之前使用了数据框(1 &0),然后计算总数。否则,它不算NG 除以找到“确定”的百分比。
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
我得到了想要的东西,但是它看起来非常丑陋且效率低下。但是我的 有限的知识,我必须快速找到某些东西并且它可以工作。想要 以更好,更简单的方式实现这一目标。 注意:当我剪切粘贴一小段时,结果可能无法完全复制 代码和结果的一部分,以解释我想要什么以及如何(很糟糕)做到这一点。
答案 0 :(得分:2)
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())
答案 1 :(得分:0)
这是我的解决方案。让我知道是否有帮助。我将成功率转换为百分比,并将小数点四舍五入为2。您可以忽略代码的最后两部分。
data.groupby(['BldgID', 'Device', 'BldHt'])['Result'].value_counts(normalize=True).round(2)*100
输出:
BldgID Device BldHt Result
1111 780 65 NG 100.0
1112 780 40 OK 100.0
1117 790 26 OK 100.0
1128 758 15 OK 100.0
1211 790 30 NG 50.0
OK 50.0
1213 758 35 NG 50.0
OK 50.0
1214 758 80 OK 67.0
NG 33.0
1222 760 75 OK 100.0
1232 780 90 OK 100.0
1246 790 16 OK 100.0
2902 780 34 OK 100.0