簡體   English   中英

尋找百分比的更有效方法

[英]A more efficient way to find percentage

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

我得到了想要的東西,但它看起來非常丑陋且效率低下。 但是,由於我的知識有限,我必須快速找到一些可行的方法。 希望以更好,更簡單的方式實現這一目標。 注意:當我剪切粘貼一小段代碼並得出解釋我想要的內容以及如何(非常)如何做到這一點時,結果可能無法完全復制。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM