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

如何高效遍历DataFrame并按条件向列表追加值?

问题场景

我的DataFrame结构如下:
DataFrame示例

我需要填充两个空列表:

sports_medicine = []
neurosurgery = []

具体需求:遍历DataFrame的每一行,当journal_grouping列的值匹配指定分组时,将对应行的concept列值追加到对应列表中。比如,当journal_grouping为"Sports & Exercise Medicine"时,把该行的concept值加入sports_medicine列表。

我写了下面的代码,但数据量大时运行极慢:

for journal_grouping in concepts_df['journal_grouping']:
   for concept in concepts_df['concept']:
      if journal_grouping == 'Sports & Exercise Medicine':
         sports_medicine.append(concept)
      if journal_grouping == 'Neurosurgery':
         neurosurgery.append(concept)

请问有没有更高效的实现方式?


优化方案

你这代码跑慢的根本原因是嵌套循环把整个列遍历了两次,相当于做了O(n²)的重复计算,数据量大的时候肯定卡。用Pandas自带的筛选功能,直接就能做到O(n)的高效处理:

方法1:直接用布尔索引提取

用布尔筛选找出符合条件的行,直接把对应concept列转成列表就行:

sports_medicine = concepts_df[concepts_df['journal_grouping'] == 'Sports & Exercise Medicine']['concept'].tolist()
neurosurgery = concepts_df[concepts_df['journal_grouping'] == 'Neurosurgery']['concept'].tolist()

方法2:分组处理(适合多分组场景)

如果之后还要加更多分组,用groupby更省心,不用重复写筛选逻辑:

for group_name, group_data in concepts_df.groupby('journal_grouping'):
    if group_name == 'Sports & Exercise Medicine':
        sports_medicine = group_data['concept'].tolist()
    elif group_name == 'Neurosurgery':
        neurosurgery = group_data['concept'].tolist()

为啥这俩方法更快?

Pandas的内置方法都是底层用C实现的,比Python层面的循环快得多,数据量越大,性能差得越明显。你原来的嵌套循环会把每个journal_grouping和所有concept配对一遍,纯纯做无用功,而上面的方法只遍历一遍数据就搞定筛选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:37:03