У меня есть фрейм данных, который выглядит так
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 - это универсальный язык программирования.
Вместо создания фиктивного столбца и 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]