Pandas:基于答案出现次数及线索差异条件筛选DataFrame行
问题描述
我正在处理一个填字游戏数据集,包含id、clue、answer、answer_len、data、source、answer_occurrencies这些字段(示例数据行:1222528, Brick floors of fireplaces, HEARTHS, 7.0, 2015-01-01, pk, 1)。
我的需求是提取满足以下条件的行:
- 答案(
answer)的总出现次数超过5次 - 且这些答案对应不同的线索(注:
answer_occurrencies字段代表同一线索下该答案的出现次数)
我已经尝试用value_counts()统计了各answer的出现次数,移除了出现次数少于5次的答案,得到了出现次数≥5的答案集合fives,代码如下:
dropped_labels = [] for key, val in train_data["answer"].value_counts().items(): if val < 5: dropped_labels.append(key) fives = train_data["answer"].value_counts().drop(labels=dropped_labels) >>>fives ONE 77 ART 72 ERA 71 ARIA 67 TEE 60 .. DIOR 5 BIRTH 5 SIEVE 5 IONE 5 BESO 5
但现在我卡在了如何从train_data中筛选出answer字段属于fives集合的行这一步,尝试的方法都失败了。作为Python新手,想请教有没有合适的Pandas内置函数可以解决这个问题?
解决方案
别担心,这其实是Pandas里很常见的筛选场景,有几种简洁的方法可以解决:
方法1:用isin()匹配答案集合
你已经得到了fives的索引(也就是符合条件的answer值),直接用isin()方法就能快速筛选原数据:
# 获取fives中的所有answer值(即fives的索引) valid_answers = fives.index # 筛选train_data中answer在valid_answers里的行 filtered_data = train_data[train_data["answer"].isin(valid_answers)]
如果要进一步保留每个answer对应的不同线索,可以在结果上添加去重操作:
# 去除重复的(answer, clue)组合,保留每个答案对应的不同线索 filtered_data_unique = filtered_data.drop_duplicates(subset=["answer", "clue"])
方法2:一步到位(更高效)
其实你可以不用先手动生成fives集合,直接用groupby()+transform()来标记符合条件的行,效率更高,还能直接完成后续的去重需求:
# 计算每个answer的总出现次数,添加为临时列 train_data["answer_total_count"] = train_data.groupby("answer")["answer"].transform("count") # 筛选总次数≥5的行,同时去重保留不同线索 filtered_data = train_data[train_data["answer_total_count"] >= 5].drop_duplicates(subset=["answer", "clue"])
这种方法不需要额外循环和生成中间集合,尤其适合处理较大的数据集。
补充说明
如果你的需求还涉及answer_occurrencies字段的限制(比如只保留同一线索下该答案出现1次的行),可以在筛选条件里追加对应规则:
filtered_data = train_data[ (train_data["answer_total_count"] >= 5) & (train_data["answer_occurrencies"] == 1) # 示例:仅保留同一线索下出现1次的行 ].drop_duplicates(subset=["answer", "clue"])
内容的提问来源于stack exchange,提问作者lpacit
相关产品推荐
相关产品推荐

