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

如何合并NumPy数组中最后一列值相同的相邻行并生成新行?

实现思路

要高效合并相邻且status相同的行,核心是给连续同status的行分配相同的分组ID,再按分组聚合计算即可,全程可以用NumPy+Pandas组合实现(Pandas的分组聚合比纯NumPy写起来更简洁,性能也足够应对万行级数据):

完整实现代码

import numpy as np
import pandas as pd

# 1. 读入数据(也可以直接用已有的NumPy数组转DataFrame)
df = pd.DataFrame({
    "seq": np.arange(31),
    "high": [55,53.75,52.5,53,51.5,51,50.25,49.25,48.75,47.5,47,46.75,45.25,44.25,42.75,44.25,44.25,46,46.75,46.25,46.5,44,43.5,44.25,43.75,41.5,42.5,42.75,43.75,42,40.5],
    "low": [53,51,51.25,50.5,49.75,49.25,49.25,48.75,47.25,45.25,46,44,43.75,42.25,41.5,42.5,42.25,43.5,45.25,45,44.25,43,42.25,42.5,41.5,39.5,40.25,40.75,41.75,39.5,39.25],
    "statuse": ["balanced","not bal","balanced","balanced","balanced","not bal","not bal","not bal","balanced","balanced","not bal","balanced","not bal","not bal","balanced","balanced","not bal","balanced","not bal","balanced","balanced","balanced","not bal","not bal","balanced","not bal","not bal","not bal","balanced","balanced","balanced"]
})

# 2. 生成连续同status的分组ID:判断当前行和上一行status是否不同,累加后即为分组ID
df["group_id"] = (df["statuse"] != df["statuse"].shift()).cumsum()

# 3. 按分组聚合,符合需求规则:
# seq取组内最后一个值(和示例期望输出seq规则一致),high取最大值,low取最小值,statuse取组内统一值
result = df.groupby("group_id").agg({
    "seq": "last",
    "high": "max",
    "low": "min",
    "statuse": "first"
}).reset_index(drop=True)

# 输出结果
print(result)

代码说明

  • 分组ID生成逻辑是整个实现的核心,没有嵌套循环和冗余的if判断,时间复杂度为O(n),即使是上万行数据也可以秒处理
  • 聚合规则可以按需调整:如果需要seq取组内第一个值,把"seq": "last"改成"seq": "first"即可
  • 要纯NumPy实现也可以,只需要手动实现分组后的max/min取值逻辑,不过Pandas的写法更简洁易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:04