我已经运行了大约45分钟的代码,并且仍在继续。有人可以向我建议如何使其更快吗?
df4是熊猫数据框。 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)
答案 0 :(得分:1)
全球范围内,您将需要groupby
。您可以:
使用两个groupby
和transform
来获得您称为size
的{{1}}和condition
的{{1}},将第一,第二:
size
或将condition & (df4['track_id'] == rowTrackID)
与value_counts
与参数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
与df4一起使用:
normalize=True
在两种情况下,您将获得与列表merge
相同的结果(假设您想成为一列)。我想说第二种方法更快,但这取决于您实际情况下的组数。