Python 找到百分比的更有效方法

Python 找到百分比的更有效方法,python,pandas,dataframe,Python,Pandas,Dataframe,使用groupby后从数据帧中确定成功/不成功 比率。虽然我在Python和pandas方面的知识有限,但我做到了,但看起来效率低下且笨拙。一定有更简单有效的方法。任何帮助都将不胜感激 BldgID BldHt Device Date Time Result 1213 35 758 20181120 105550 OK 1213 35 758 20181120 105540 NG 1112 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, 设备]并查找其结果百分比,即OK/OK+NG。我所做的 was,将“OK”更改为“1”,将“NG”更改为“0”。把所有的“OK”加起来。找到 总数(OK+NG),我在更改其值(1)之前使用了数据帧 &0)并计算总数。否则,它不计算长度 将它们除以以找到“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
我得到了我想要的,但它看起来非常丑陋和低效。但是用我的 有限的知识,我必须找到一些快速和它的工作。想 以更好、更简单的方式实现这一点。 注意:当我剪切粘贴一小块时,结果可能无法准确再现
代码和结果的一部分,用于解释我想要什么以及我做得如何(糟糕)。

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())

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())

你可以用mean来计算百分比
df.groupby(['BldgID','Device'])['Result'].apply(lambda x:'x='OK').mean())
这有用吗?可以使用mean来计算百分比
df.groupby(['BldgID','Device'])['Result'].apply(lambda x:'x='OK').mean())
这有用吗?非常感谢。在一个小部件上尝试过,似乎工作正常。如何使用平均值为新生成的列(4)命名,以像其他列一样访问此属性?谢谢。实际上我也用同样的方法试过。但不起作用。如果我尝试使用相同的df名称,那么它会给出以下类型的错误:如果我创建了一个新的df,那么插入列的索引与框架索引不兼容,比如说df1=df.groupby(['BldgID','Device'])['Result']。apply(lambda x:'x='OK').mean()),那么它不会给出错误,但会给出df1.head(10)不显示新列名。添加新列已解决!只需在末尾添加reset_index()。也就是说,df['mean_ok']=df.groupby(['BldgID','Device'])['Result']\.apply(lambda x:(x='ok').mean()).reset_index()非常感谢。在一个小部件上尝试过,似乎工作正常。如何使用平均值为新生成的列(4)命名,以像其他列一样访问此属性?谢谢。实际上我也用同样的方法试过。但不起作用。如果我尝试使用相同的df名称,那么它会给出以下类型的错误:如果我创建了一个新的df,那么插入列的索引与框架索引不兼容,比如说df1=df.groupby(['BldgID','Device'])['Result']。apply(lambda x:'x='OK').mean()),那么它不会给出错误,但会给出df1.head(10)不显示新列名。添加新列已解决!只需在末尾添加reset_index()。也就是说,df['mean_ok']=df.groupby(['BldgID','Device'])['Result']\.apply(lambda x:(x='ok').mean()).reset_index()