如何高效遍历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
相关产品推荐
相关产品推荐

