遍历熊猫数据框中的行花费的时间太长

时间:2020-03-12 20:00:32

标签: python pandas pandas-groupby

我已经运行了大约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)

1 个答案:

答案 0 :(得分:1)

全球范围内,您将需要groupby。您可以:

使用两个groupbytransform来获得您称为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相同的结果(假设您想成为一列)。我想说第二种方法更快,但这取决于您实际情况下的组数。