Более эффективный способ найти процент - PullRequest
0 голосов
/ 11 июля 2019

Из фрейма данных после использования 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, Device] и найти их процент от результата, то есть 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

Я получил то, что хотел, но это выглядит очень некрасиво и неэффективно.Но с моими ограниченными знаниями я должен найти что-то быстрое, и это работает.Хотите добиться этого лучше и проще.примечание: результат может быть не совсем точно воспроизведен, так как я вырезал и вставил небольшую часть кода и объяснял, чего я хочу, и как (плохо) я это сделал.

1 Ответ

2 голосов
/ 11 июля 2019

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...