Цикл по строкам в Pandas кадре данных занимает слишком много времени - PullRequest
0 голосов
/ 12 марта 2020

Я выполняю код около 45 минут и продолжаю работать. Может кто-нибудь предложить мне, как я могу сделать это быстрее?

df4 - это фрейм данных panda. df4.head () выглядит следующим образом

df4 = pd.DataFrame({ 
    'hashtag':np.random.randn(3000000),
    'sentiment_score':np.random.choice( [0,1], 3000000),
    'user_id':np.random.choice( ['11','12','13'], 3000000),
    })

Я хочу получить новый столбец с рейтингом.

len (df4.index) - 3 037 321.

ratings = []
for index in df4.index:
    rowUserID = df4['user_id'][index]
    rowTrackID = df4['track_id'][index]
    rowSentimentScore = df4['sentiment_score'][index]

    condition = ((df4['user_id'] == rowUserID) & (df4['sentiment_score'] == rowSentimentScore))
    allRows = df4[condition]
    totalSongListendForContext = len(allRows.index)

    rows = df4[(condition & (df4['track_id'] == rowTrackID))]
    songListendForContext = len(rows.index)

    rating = songListendForContext/totalSongListendForContext
    ratings.append(rating)

1 Ответ

1 голос
/ 13 марта 2020

В глобальном масштабе вам понадобится 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 (который, как я полагаю, вы хотите использовать в качестве столбца). Я бы сказал, что второй вариант быстрее, но он зависит от количества групп, которые у вас есть в вашем реальном случае.

...