You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于含重复值列表筛选Pandas DataFrame行并保留重复匹配结果

哈哈,这个需求我太熟了!常规的布尔筛选确实只会返回唯一匹配的行,根本没法满足“列表里值重复几次就对应行重复几次”的要求,给你两个实用的解决方案:

解决方案

方法1:列表推导式 + pd.concat(直观易懂)

这种方法逻辑直白,直接遍历你的重复列表,每次取出对应行后拼接起来:

import pandas as pd

# 替换成你实际用来匹配的列名,比如'protein_id'之类的
match_col = 'protein'
new_df = pd.concat(
    [with_prot_choice_df[with_prot_choice_df[match_col] == val] 
     for val in with_prot_choices],
    ignore_index=True
)

解释

  • 遍历with_prot_choices里的每一个值,每次筛选出原DataFrame中匹配列等于该值的行
  • 用pd.concat把所有筛选出来的小DataFrame拼接成一个完整的新DataFrame
  • ignore_index=True会重置新DataFrame的索引,避免出现重复索引的问题

方法2:merge合并法(高效适合大数据集)

如果你的DataFrame或列表规模比较大,用merge的方法效率更高,因为它是基于向量的批量操作:

import pandas as pd

match_col = 'protein'
# 把重复列表转换成临时DataFrame
temp_df = pd.DataFrame({match_col: with_prot_choices})
# 左连接原DataFrame,自动保留所有重复匹配的行
new_df = pd.merge(temp_df, with_prot_choice_df, on=match_col, how='left')

解释

  • 先把重复列表转成只有匹配列的临时DataFrame,这样列表里的重复值会变成临时DataFrame里的重复行
  • 用merge做左连接,临时DataFrame里的每一行都会和原DataFrame中匹配的行对应一次,自然就实现了“重复值对应重复行”的效果
示例演示

假设原DataFrame是这样的:

proteinscore
protA85
protB92
protC78

你的重复列表是 with_prot_choices = ['protA', 'protB', 'protA', 'protA']

用上面任意一种方法得到的新DataFrame都会是:

proteinscore
protA85
protB92
protA85
protA85

完全符合你要的重复行需求!

内容的提问来源于stack exchange,提问作者user3289556

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:15:45