快速实现每个用户熊猫的最大值

时间:2021-08-01 14:03:25

标签: pandas

以下是我正在使用的一段代码,它需要每个用户并为每个用户获取一个值,根据排序方案,问题是它的运行速度相对于我的需要来说相对较慢,想知道它是否可以更快地实施:

import pandas as pd

df1 = pd.DataFrame({'user': ['a', 'b', 'c', 'd'],
                   'user_info': [1, 3, 5, 6]},
                   columns=['user', 'user_info'])

df2 = pd.DataFrame({'user': ['a', 'b', 'f', 'h'],
                   'user_info': [3, 5, 5, 6]},
                   columns=['user', 'user_info'])


data_frames_dict_with_importance_score = {2: df2,
                                          1: df1}


def apply_importance(df, importance):
    df['tag_max'] = importance
    return df


join_list = ['user', 'user_info']

final_recommendations = pd.concat([apply_importance(df[join_list], importance)
                                   for importance, df in data_frames_dict_with_importance_score.items()])

final_recommendations = final_recommendations.sort_values(['user', 'tag_max'], ascending=False).groupby(
    ['user'], as_index=False).head(1)
final_recommendations.reset_index(inplace=True)

对此的任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

您可以在列表推导式中分配 tag_max,然后使用 sort_values 进行连接,然后删除重复项:

out = pd.concat((v.assign(tag_max=k) for 
                 k,v in data_frames_dict_with_importance_score.items()))\
.sort_values(['user', 'tag_max'], ascending=False).drop_duplicates('user')

或者:

out = pd.concat(data_frames_dict_with_importance_score,names=['tag_max','Index'])\
.reset_index().sort_values(['user', 'tag_max'], ascending=False).drop_duplicates('user')

  user  user_info  tag_max
3    h          6        2
2    f          5        2
3    d          6        1
2    c          5        1
1    b          5        2
0    a          3        2