寻找百分比的更有效方法

时间:2019-07-11 13:30:40

标签: python pandas dataframe

从使用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

我得到了想要的东西,但是它看起来非常丑陋且效率低下。但是我的 有限的知识,我必须快速找到某些东西并且它可以工作。想要 以更好,更简单的方式实现这一目标。 注意:当我剪切粘贴一小段时,结果可能无法完全复制 代码和结果的一部分,以解释我想要什么以及如何(很糟糕)做到这一点。

2 个答案:

答案 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