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

如何对DataFrame中标记行的对应子列切片求位置均值?

问题描述

现有如下结构的DataFrame(第一列为标记列,第二列为数据列):

1 4
0 3
0 1
0 3
1 2
0 0
0 6

已知第一列中的1彼此间隔大于N步,需求如下:

  • 定位第一列中每个1的出现位置
  • 从该位置开始,提取第二列中长度为M(M<N)的连续切片
  • 对所有切片的对应位置元素分别求均值(比如两个切片[4,3]和[2,0],结果为[(4+2)/2, (3+0)/2])

示例:当M=2时,最终结果应为[3.0, 1.5](可表示为Series或列表)。

目前仅能想到逐行遍历的方法,希望得到更优实现思路。

高效实现方案

不用逐行遍历,直接利用pandas/numpy的向量化操作即可高效完成,步骤如下:

  1. 定位所有1的索引
    先提取第一列中值为1的所有行索引:
import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'col1': [1, 0, 0, 0, 1, 0, 0],
    'col2': [4, 3, 1, 3, 2, 0, 6]
})

# 获取标记为1的行索引列表
target_indices = df[df['col1'] == 1].index.tolist()
  1. 提取切片并构造二维结构
    由于1的间隔大于N、M<N,所以各切片不会重叠,直接按索引提取每个M长度的切片并组合成二维数组:
import numpy as np

M = 2
# 提取所有目标切片并转为二维数组
slices_array = np.array([df['col2'].iloc[idx:idx+M].values for idx in target_indices])
  1. 按位置计算均值
    直接对二维数组的列维度求均值,得到最终结果:
result = slices_array.mean(axis=0).tolist()
# 输出结果:[3.0, 1.5]

如果偏好纯pandas实现,也可以将切片转为DataFrame后按列求均值:

slice_df = pd.DataFrame([df['col2'].iloc[idx:idx+M].values for idx in target_indices])
result = slice_df.mean(axis=0).tolist()

这种向量化运算的方式避免了逐行循环,数据量越大,效率优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:21