Подсчитайте заданные значения c и агрегируйте результат в кадре данных с использованием преобразования - PullRequest
3 голосов
/ 30 апреля 2020

У меня есть датафрейм, похожий на этот:

    Errorid  Matricule Priority
0      1        01       P1
1      2        01       P2
2      3        01       NC
3      4        02       P1
4      5        02       P4
5      6        02       EDC
6      7        02       P2

В этом списке перечислены все ошибки для Matricule и их приоритет.

Что я хочу сделать, это подсчитать все ошибки для Matricule , исключая "N C" и "ED C" и поместите результат в тот же самый кадр данных.

Пример результата:

    Errorid  Matricule Priority  NberrorsMatricule
0      1        01       P1           2
1      2        01       P2           2
2      3        01       NC           2
3      4        02       P1           3
4      5        02       P4           3
5      6        02       EDC          3
6      7        02       P2           3

Я пробовал несколько вещей, как показано ниже:

DF['NberrorsMatricule'] = DF.groupby('Matricule')['Pirority'].transform(lambda x : x.count() if x in ['P1','P2','P3','P4']) 

DF['NberrorsMatricule'] = DF.groupby('Matricule')[DF['Pirority'] in ['P1','P2','P3','P4']].transform("count")

Каждый раз, когда я получаю неоднозначную ошибку значения. ValueError: Истинное значение ряда неоднозначно. Используйте a.empty (), a.bool (), a.item (), a.any (), a.all ().

Обратите внимание, что эта работа:

DF['NberrorsMatricule'] = DF.groupby('Matricule')['Pirority'].transform("count") 

Но это, очевидно, не фильтрует приоритетность.

Эти кадры данных являются примером, в действительности я работаю с огромным количеством данных (более 400 000 экземпляров в этом), так что если кто-то может помочь мне понять поведение transform () и способы эффективной фильтрации данных. Было бы очень приятно.

Заранее благодарен за помощь

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вот так:

In [567]:  df['NberrorsMatricule'] = df[~df.Priority.isin(['NC', 'EDC'])].\ 
     ...:                               groupby('Matricule')['Errorid']\ 
     ...:                               .transform('count')                                                                          

Чтобы удалить Nan, используйте ffill():

In [595]: df['NberrorsMatricule'] = df['NberrorsMatricule'].ffill()                                                                                                                                         

In [596]: df                                                                                                                                                                                                
Out[596]: 
   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                2.0
1        2          1       P2                2.0
2        3          1       NC                2.0
3        4          2       P1                3.0
4        5          2       P4                3.0
5        6          2      EDC                3.0
6        7          2       P2                3.0
2 голосов
/ 30 апреля 2020

Вы можете заменить несоответствующие значения отсутствующим значениям на Series.where и Series.isin, поэтому при использовании GroupBy.transform с GroupBy.count исключает пропущенные значения:

L = ['P1','P2','P3','P4']
df['NberrorsMatricule'] = (df['Priority'].where(df['Priority'].isin(L))
                                         .groupby(df['Matricule'])
                                         .transform('count'))
print (df)
   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                  2
1        2          1       P2                  2
2        3          1       NC                  2
3        4          2       P1                  3
4        5          2       P4                  3
5        6          2      EDC                  3
6        7          2       P2                  3

Подробности :

print (df['Priority'].where(df['Priority'].isin(L)))
0     P1
1     P2
2    NaN
3     P1
4     P4
5    NaN
6     P2
Name: Priority, dtype: object

Другое решение заключается в подсчете совпадающих значений на sum для преобразования True и False до 1, 0 возможно использование Series.view или Series.astype:

df['NberrorsMatricule'] = (df['Priority'].isin(L)
                                         .view('i1')
                                         .groupby(df['Matricule'])
                                         .transform('sum'))
print (df)

   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                  2
1        2          1       P2                  2
2        3          1       NC                  2
3        4          2       P1                  3
4        5          2       P4                  3
5        6          2      EDC                  3
6        7          2       P2                  3
...