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

如何利用列表或另一个DataFrame在Pandas中选取多个切片

高效批量提取DataFrame切片的方案

核心需求

基于包含from和to列的selection表,批量从大型DataFrame的data列中提取指定切片,避免显式for循环,提升效率。


方法1:使用apply快速生成切片列表

适合中小规模的selection表,代码简洁直观:

先构造示例数据(可替换为你的真实数据):

import pandas as pd
import numpy as np

# 模拟大型数据集
df = pd.DataFrame({"data": np.arange(100)})
# 切片规则表
selection = pd.DataFrame({"from": [1, 4, 7], "to": [3, 5, 9]})

执行批量切片:

# 按行处理selection,生成每个切片的Series
subsets = selection.apply(
    lambda row: df["data"].loc[row["from"]:row["to"]],
    axis=1
).tolist()

# 输出结果示例
for idx, subset in enumerate(subsets):
    print(f"切片{idx+1}:\n{subset}\n")
  • 若需提取整行DataFrame而非单列,将df["data"]替换为df即可。
  • 若使用位置索引而非标签索引,将loc改为iloc。

方法2:向量化掩码分组(超大数据集首选)

通过构造掩码标记数据归属,完全规避循环,性能更优:

# 初始化掩码,-1表示不属于任何切片
mask = np.full(len(df), -1, dtype=int)

# 为每个切片范围标记对应的子集ID
for subset_id, (_, row) in enumerate(selection.iterrows()):
    # 注意:pandas切片左闭右开,所以to需要+1才能包含目标索引
    mask[row["from"] : row["to"] + 1] = subset_id

# 筛选有效数据并按子集ID分组
valid_data = df["data"][mask != -1]
subsets_vectorized = [group for _, group in valid_data.groupby(mask[mask != -1])]

# 输出结果示例
for idx, subset in enumerate(subsets_vectorized):
    print(f"向量法切片{idx+1}:\n{subset}\n")
  • 该方法在selection行数多、数据集超大时,效率远高于apply。
  • 若索引为非连续标签,需先将from和to转换为对应的位置索引(使用df.index.get_indexer)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:00:47