基于所属分组计算用户得分的Python实现技术问询
Python实现用户分组得分计算
问题背景
现有两个DataFrame,分别存储用户特征分组信息和分组参数:
用户特征与分组DataFrame(df1)
import pandas as pd df1 = pd.DataFrame({ 'user': ['user 1', 'user 2', 'user 3', 'user 4', 'user 5'], 'x1': [[0.2, 0.3, 0.5],[0.3, 0.3, 0.4],[0.4, 0.4, 0.2],[0.2, 0.1, 0.7],[0.5,0.3,0.2]], 'group': [1, 0, 0, 2, 1] })
df1输出:
user x1 group 0 user 1 [0.2, 0.3, 0.5] 1 1 user 2 [0.3, 0.3, 0.4] 0 2 user 3 [0.4, 0.4, 0.2] 0 3 user 4 [0.2, 0.1, 0.7] 2 4 user 5 [0.5, 0.3, 0.2] 1
分组参数DataFrame(df2)
df2 = pd.DataFrame({ 'group': [0, 1, 2], 'x2': [[0.4, 0.2, 0.4],[0.5, 0.1, 0.4], [0.5, 0.1, 0.4]], 'p2': [0.231, 0.342, 0.411], 'threshold': [0.9, 0.6, 0.8] })
df2输出:
group x2 p2 threshold 0 0 [0.4, 0.2, 0.4] 0.231 0.9 1 1 [0.5, 0.1, 0.4] 0.342 0.6 2 2 [0.5, 0.1, 0.4] 0.411 0.8
得分计算公式
每个用户的得分( S )计算公式为:
( S = \frac{1}{k} \cdot (x_2 - x_1)^T \cdot (x_2 - x_1) + p_2 )
其中:
- ( k ):用户所属分组的用户数量(分组规模)
- ( (x_2 - x_1)^T \cdot (x_2 - x_1) ):分组向量( x_2 )与用户特征向量( x_1 )差值的内积(等价于向量元素差的平方和)
- ( p_2 ):对应分组的参数
实现步骤与代码
完整代码
import pandas as pd import numpy as np # 初始化DataFrame df1 = pd.DataFrame({ 'user': ['user 1', 'user 2', 'user 3', 'user 4', 'user 5'], 'x1': [[0.2, 0.3, 0.5],[0.3, 0.3, 0.4],[0.4, 0.4, 0.2],[0.2, 0.1, 0.7],[0.5,0.3,0.2]], 'group': [1, 0, 0, 2, 1] }) df2 = pd.DataFrame({ 'group': [0, 1, 2], 'x2': [[0.4, 0.2, 0.4],[0.5, 0.1, 0.4], [0.5, 0.1, 0.4]], 'p2': [0.231, 0.342, 0.411], 'threshold': [0.9, 0.6, 0.8] }) # 1. 合并两个DataFrame,关联用户与所属分组的参数 merged_df = pd.merge(df1, df2, on='group', how='left') # 2. 计算每个分组的规模k,合并到结果中 group_sizes = df1['group'].value_counts().reset_index() group_sizes.columns = ['group', 'k'] merged_df = pd.merge(merged_df, group_sizes, on='group', how='left') # 3. 定义得分计算函数 def calculate_score(row): x1_arr = np.array(row['x1']) x2_arr = np.array(row['x2']) diff = x2_arr - x1_arr # 计算差值的内积(平方和) inner_product = np.dot(diff, diff) return (inner_product / row['k']) + row['p2'] # 4. 对每一行应用得分计算函数 merged_df['S'] = merged_df.apply(calculate_score, axis=1) # 查看最终结果(仅保留关键列) print(merged_df[['user', 'group', 'S']])
输出结果
user group S 0 user 1 1 0.387000 1 user 2 0 0.246000 2 user 3 0 0.256000 3 user 4 2 0.706000 4 user 5 1 0.347667
内容的提问来源于stack exchange,提问作者alxander21
相关产品推荐
相关产品推荐

