Групповое количество ненан в другом столбце и конкретный расчет тех же столбцов в панд

#python-3.x #pandas #dataframe

Вопрос:

У меня есть фрейм данных, как показано ниже

 ID    Class    Score1       Score2   Name
1     A        9            7        Xavi
2     B        7            8        Alba
3     A        10           8        Messi
4     A        8            10       Neymar
5     A        7            8        Mbappe
6     C        4            6        Silva
7     C        3            2        Pique
8     B        5            7        Ramos
9     B        6            7        Serge
10    C        8            5        Ayala
11    A        NaN          4        Casilas
12    A        NaN          4        De_Gea
13    B        NaN          2        Seaman
14    C        NaN          7        Chilavert
15    B        NaN          3        Courtous
 

Исходя из вышесказанного, я хотел бы рассчитать количество игроков с scoer1 меньше или равно 6 в каждом классе, а также количество строк, не относящихся к NaN (по классам).

Ожидаемый результат:

 Class     Total_Number   Count_Non_NaN    Score1_less_than_6_#    Avg_score1  
A         6              4                0                       8.5 
B         5              3                2                       6 
C         4              3                2                       5
 

пробовал ниже кода

 df2 = df.groupby('Class').agg(Total_Number = ('Score1','size'),
                             Score1_less_than_6 = ('Score1',lambda x: x.between(0,6).sum()),
                             Avg_score1 = ('Score1','mean'))

df2 = df2.reset_index()
df2
 

Ответ №1:

Groupby и aggregate пользоваться словарем

 df['s'] = df['Score1'].le(6)
df.groupby('Class').agg(**{'total_number': ('Score1', 'size'),
                           'count_non_nan': ('Score1', 'count'),
                           'score1_less_than_six': ('s', 'sum'),
                           'avg_score1': ('Score1', 'mean')})
 

        total_number  count_non_nan  score1_less_than_six  avg_score1
Class                                                               
A                 6              4                     0         8.5
B                 5              3                     2         6.0
C                 4              3                     2         5.0
 

Ответ №2:

Попробуй:

 x = df.groupby("Class", as_index=False).agg(
    Total_Number=("Class", "count"),
    Count_Non_NaN=("Score1", lambda x: x.notna().sum()),
    Score1_less_than_6=("Score1", lambda x: (x <= 6).sum()),
    Avg_score1=("Score1", "mean"),
)
print(x)
 

С принтами:

   Class  Total_Number  Count_Non_NaN  Score1_less_than_6  Avg_score1
0     A             6            4.0                 0.0         8.5
1     B             5            3.0                 2.0         6.0
2     C             4            3.0                 2.0         5.0