Pandas中如何提取双用户评分均高于0的公共列
结论
这个筛选逻辑完全可以用Pandas实现,不需要拼接复杂的自定义函数,核心就是排除非评分列之后,逐列判断该列所有用户的评分是不是都大于0,最后把符合条件的列名收集成列表就行。
实现步骤
- 先把
user_id列从判断范围里排除:这列是字符串类型的用户标识,根本不是评分值,留着参与大小比较会直接报类型错误 - 对剩下的所有电影评分列做逐元素的大于0判断,得到和原评分块同形状的布尔矩阵
- 沿着列的方向做聚合校验:如果某一列的所有布尔值都是True,就说明这列下所有用户的评分都高于0,符合筛选要求
- 把符合条件的列名提取出来,转成普通Python列表就完成了
可直接跑通的代码
import pandas as pd # 还原题目给的两行评分数据 df = pd.DataFrame({ "user_id": ["512A", "AB72"], "movieA": [0.0, 1.0], "movieB": [1.0, 2.0], "movieC": [2.0, 0.0], "movieD": [1.0, 3.0] }) # 核心筛选逻辑 score_df = df.drop(columns="user_id") # 按列校验所有评分是否都大于0,取对应列名转列表 target_list = score_df.columns[(score_df > 0).all(axis=0)].tolist()
跑出来的target_list值就是['movieB', 'movieD'],和示例的预期结果完全一致。
容易踩的坑
all()的axis参数别传错:传axis=0才是按列做校验,也就是检查某一列所有行的布尔值是不是全为真;要是错传成axis=1,就变成逐行判断用户的所有评分是不是都大于0,出来的结果完全不对- 这种写法是Pandas原生的向量化操作,比逐列循环判断的效率高很多,哪怕后续扩展到上千用户、上万部电影,运行速度也不会有明显下降
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

