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

基于Pandas/Numpy优化DataFrame固定间隔选取A列值的方案咨询

按固定间隔选取DataFrame列值的优化方案

问题背景

给定如下DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.rand(100, 3), columns=list('ABC'))

需求为按固定间隔选取A列的值,原实现脚本如下:

n=0
for i in range(0, len(df), 22):
    if i+22+n < len(df):
        print(df.A.iloc[[i+n, i+22+n]])
    else: print(i+n, len(df)-1)
    n+=1

原脚本可正常运行,但希望获得基于Pandas或Numpy的更优、更高效的实现方案。

优化方案

一、Pandas 向量化实现

核心思路是通过向量化操作批量生成所有需要选取的索引对,避免Python循环中的逐次判断,提升效率:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.rand(100, 3), columns=list('ABC'))

# 计算总分组数
total_groups = len(df) // 22 + 1
# 生成每组的偏移量(对应原脚本中的n)
offsets = np.arange(total_groups)

# 生成每组的两个索引
idx1 = 22 * np.arange(total_groups) + offsets
idx2 = 22 * (np.arange(total_groups) + 1) + offsets
# 处理最后一组索引超出数据范围的情况
idx2 = np.where(idx2 < len(df), idx2, len(df)-1)

# 遍历输出每组结果
for i1, i2 in zip(idx1, idx2):
    if i1 == i2:
        print(i1, i2)
    else:
        print(df['A'].iloc[[i1, i2]])

二、Numpy 原生数组处理

若不需要保留Pandas Series的输出格式,直接操作Numpy数组能获得更高的性能,适合大规模数据集:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.rand(100, 3), columns=list('ABC'))
a_col = df['A'].values

total_groups = len(a_col) // 22 + 1
offsets = np.arange(total_groups)

idx1 = 22 * np.arange(total_groups) + offsets
idx2 = 22 * (np.arange(total_groups) + 1) + offsets
# 用minimum直接截断超出范围的索引
idx2 = np.minimum(idx2, len(a_col)-1)

# 按格式输出结果
for i1, i2 in zip(idx1, idx2):
    if i1 == i2:
        print(i1, i2)
    else:
        print(f"{i1}     {a_col[i1]}")
        print(f"{i2}    {a_col[i2]}")
        print("Name: A, dtype: float64")
        print()

方案优势

  • 效率更高:用向量化操作替代Python循环中的逐次判断,数据量越大,性能提升越明显
  • 可维护性强:间隔参数(如示例中的22)只需修改一处即可调整整个选取逻辑,便于后续修改
  • 逻辑清晰:索引生成逻辑集中处理,避免循环内的复杂条件分支,代码可读性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:50:23