pandas 中如何依据指定行取值筛选对应列子集构建新DataFrame
核心实现逻辑
这套需求不需要手动逐列循环遍历,核心判断规则是:基于指定用户的行取值做非空校验,只保留该用户给出过评分的对应电影列,同时完整保留所有用户行的原有评分数据。
具体操作步骤
- 定位指定用户对应的行数据
直接通过pandas的行索引取值,比如目标用户行索引为0,执行df.loc[0]即可拿到该用户对所有电影的评分序列。 - 校验行内非空值,提取目标列名
对拿到的用户评分序列调用notna()方法,生成同长度的布尔掩码:掩码值为True的位置,对应用户给出过评分的电影列;值为False的位置,对应用户未评分的电影列。
从布尔掩码中提取值为True的列名集合,就是新表需要保留的列。 - 基于列名集合截取原DataFrame,生成新表
用提取到的列名索引原DataFrame,即可得到符合要求的结果表。
可直接复用的代码
# 原始DataFrame对象命名为df target_user_idx = 0 # 替换为实际需要指定的目标用户行索引 # 获取目标用户的评分行数据 user_rating_row = df.loc[target_user_idx] # 筛选该用户非空评分对应的列 keep_cols = user_rating_row[user_rating_row.notna()].index # 生成筛选后的新DataFrame new_df = df[keep_cols]
注意事项
- 如果遇到目标用户所有评分为空的场景(比如示例中行索引为4的用户),上述代码会返回无任何数据列的空DataFrame,可以按需增加判断逻辑,比如检测到
keep_cols长度为0时给出提示,避免后续数据操作报错。 - 该实现是pandas原生向量化操作,相比手动逐列遍历判断的效率更高,尤其当电影列数规模较大时性能优势更明显。
- 生成的新表会完整保留所有原始用户行的评分信息,仅过滤掉目标用户未评分的列,和示例给出的期望输出结构完全一致。
内容的提问来源于stack exchange,提问作者Cameron Cheung
相关产品推荐
相关产品推荐

