В глобальном масштабе вам понадобится groupby
. Вы можете либо:
использовать два groupby
с transform
, чтобы получить size
того, что вы назвали condition
и size
condition & (df4['track_id'] == rowTrackID)
, разделить второе за первым:
df4['ratings'] = (df4.groupby(['user_id', 'sentiment_score','track_id'])['track_id'].transform('size')
/ df4.groupby(['user_id', 'sentiment_score'])['track_id'].transform('size'))
Или используйте groupby
с value_counts
с параметром normalize=True
и merge
результат с df4:
df4 = df4.merge(df4.groupby(['user_id', 'sentiment_score'])['track_id']
.value_counts(normalize=True)
.rename('ratings').reset_index(),
how='left')
в обоих случаях вы получите тот же результат, что и ваш список ratings
(который, как я полагаю, вы хотите использовать в качестве столбца). Я бы сказал, что второй вариант быстрее, но он зависит от количества групп, которые у вас есть в вашем реальном случае.