如何在Python中根据嵌套列表的索引范围提取DataFrame行?
实现方法
当然有简洁的实现方式,核心思路是把每个子列表的起止范围转换成连续整数序列,再合并所有序列。以下是几种常用方案:
方法1:使用itertools.chain + range
借助itertools.chain快速合并多个连续序列,代码简洁且效率不错:
import itertools import pandas as pd df = pd.DataFrame({'x': [0,1,2,3,4,5,6,7]}) a = [[2,4], [6,7]] # 展开索引:每个子列表转成包含两端的连续序列,再合并 indices = list(itertools.chain.from_iterable(range(start, end+1) for start, end in a)) # 提取目标行 result_df = df.loc[indices]
注:
range(start, end)是左闭右开区间,所以要给end加1才能包含子列表的右端点(比如4和7)。
方法2:使用numpy.arange
如果习惯用numpy处理数值序列,这种方式也很直观:
import numpy as np import pandas as pd df = pd.DataFrame({'x': [0,1,2,3,4,5,6,7]}) a = [[2,4], [6,7]] # 生成多个连续数组并拼接,再转成列表 indices = np.concatenate([np.arange(start, end+1) for start, end in a]).tolist() result_df = df.loc[indices]
方法3:纯列表推导式(无需额外库)
如果不想引入第三方库,嵌套列表推导式就能搞定:
import pandas as pd df = pd.DataFrame({'x': [0,1,2,3,4,5,6,7]}) a = [[2,4], [6,7]] indices = [num for start, end in a for num in range(start, end+1)] result_df = df.loc[indices]
额外优化:处理起止顺序不确定的情况
如果子列表里的起止可能颠倒(比如出现[4,2]这种情况),可以用min和max兼容:
indices = [num for s, e in a for num in range(min(s,e), max(s,e)+1)]
内容的提问来源于stack exchange,提问作者HappyPy
相关产品推荐
相关产品推荐

