Python 找到百分比的更有效方法
使用groupby后从数据帧中确定成功/不成功 比率。虽然我在Python和pandas方面的知识有限,但我做到了,但看起来效率低下且笨拙。一定有更简单有效的方法。任何帮助都将不胜感激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
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()