如何非逐行迭代修改Pandas DataFrame列值并按条件删除行
Pandas 高效处理相似项与分数过滤问题
需求说明
给定包含主项、3个相似项及对应相似度分数的DataFrame,需完成两个操作:
- 若某相似项的对应分数低于0.8,将该相似项列设为空字符串
- 删除所有分数均低于0.8的行
原始数据
import pandas as pd # 构造原始DataFrame data = { 0: ['python', 'coke', 'apple'], 'top1': ['perl', 'diel_coke', 'car'], 'top2': ['php', 'pepsi', 'house'], 'top3': ['java', 'taco', 'hill'], 'score1': [0.9, 0.85, 0.3], 'score2': [0.7, 0.9, 0.1], 'score3': [0.4, 0.23, 0.05] } df = pd.DataFrame(data)
原始DataFrame输出:
0 top1 top2 top3 score1 score2 score3 0 python perl php java 0.9 0.7 0.40 1 coke diel_coke pepsi taco 0.85 0.9 0.23 2 apple car house hill 0.3 0.1 0.05
高效实现方案(无逐行迭代)
利用Pandas的矢量化操作完成处理,避免循环迭代带来的性能损耗:
1. 替换低分对应的相似项为空字符串
通过where方法,结合分数列的布尔条件批量修改top列:
# 匹配top列与对应score列 col_pairs = [('top1', 'score1'), ('top2', 'score2'), ('top3', 'score3')] for top_col, score_col in col_pairs: # 仅保留分数>=0.8的相似项,其余设为空 df[top_col] = df[top_col].where(df[score_col] >= 0.8, '')
2. 过滤全低分的行
通过ge(大于等于)和any方法,筛选出至少有一个分数达标(>=0.8)的行:
# 检查每行是否存在至少一个分数>=0.8,保留符合条件的行 df = df[df[['score1', 'score2', 'score3']].ge(0.8).any(axis=1)]
处理后结果
0 top1 top2 top3 score1 score2 score3 0 python perl 0.9 0.7 0.40 1 coke diel_coke pepsi 0.85 0.9 0.23
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

