Pandas Dataframe группирует, быстро подсчитывает количество строк

У меня есть фрейм данных, который выглядит так

Class_ID  Student_ID  feature
1         4           31
1         4           86
1         4           2
1         2           11
1         2           0
5         3           2
5         9           3
5         9           2

и я хотел бы посчитать, сколько раз ученик появляется в каждом Class_ID, поэтому желаемый результат выглядит следующим образом:

Class_ID  Student_ID  feature  count
1         4           31       3
1         4           86       3
1         4           2        3
1         2           11       2
1         2           0        2
5         3           2        1
5         9           3        2
5         9           2        2

и вот как я это сделал:

df['dummy'] = 1
df['count'] = df.groupby(['Class_ID', 'Student_ID'], group_keys=False)['dummy'].transform(lambda x: x.sum())

Он работает нормально, но мой фактический фрейм данных довольно большой (~ 1 миллион строк), а код довольно медленный, поэтому я хотел бы спросить, есть ли более быстрый/лучший способ сделать это? Спасибо.

🤔 А знаете ли вы, что...
Python - это универсальный язык программирования.


53
2

Ответы:

Решено

Вместо создания фиктивного столбца и transform можно использовать "size":

df["count"] = df.groupby(["Class_ID", "Student_ID"]).transform("size")

На моей машине это примерно в 3/4 раза быстрее для 1 миллиона строк.

Выход:

   Class_ID  Student_ID  feature  count
0         1           4       31      3
1         1           4       86      3
2         1           4        2      3
3         1           2       11      2
4         1           2        0      2
5         5           3        2      1
6         5           9        3      2
7         5           9        2      2

Вы можете рассмотреть возможность использования подхода numpy через np.unique:

_, idx, counts = np.unique(
    np.array(list(zip(df['Class_ID'], df['Student_ID']))), 
    axis=0, 
    return_inverse=True, 
    return_counts=True
)

df['count'] = counts[idx]