如何合并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
相关产品推荐
相关产品推荐

