如何在Pandas中查找最匹配指定条件的DataFrame连续行分组
Pandas 高效分组匹配实现方案
核心思路是用Pandas内置的向量化操作、C层面实现的分组聚合替代纯Python逐行遍历,性能比手写循环高1~2个数量级,可轻松支撑百万级以上数据集处理。
实现步骤
1. 预处理时间字段,生成分组键
首先确保时间索引为标准datetime格式,针对示例中1天时间跨度的要求,直接按自然日切割分组即可:
import pandas as pd # 转换索引为datetime类型(若已是标准格式可跳过) df.index = pd.to_datetime(df.index) # 生成按天的分组键 df["group_key"] = df.index.date
如果需要的是任意连续1天的滑动窗口(而非按自然日切割),可以直接使用Pandas原生的时间滚动窗口API,无需手动遍历判断时间差。
2. 向量化计算各分组匹配占比
通过布尔序列直接标记Strength列符合区间要求的行,分组聚合一次性算出所有分组的匹配占比,全程无Python层循环:
# 标记Strength落在目标区间的行,即0.75 <= Strength <= 0.9 df["is_match"] = df["Strength"].between(0.75, 0.9) # 分组聚合:count为组内总行数,mean为匹配行占比(匹配数/总数) group_metrics = df.groupby("group_key")["is_match"].agg(["count", "mean"]) # 提取占比最高的分组 best_group = group_metrics["mean"].idxmax()
3. 提取最优分组结果
筛选出最优分组对应的所有行,删除过程中生成的辅助列即可得到预期输出:
result = df[df["group_key"] == best_group].drop(columns=["group_key", "is_match"])
用提供的示例数据运行上述代码,得到的result和预期输出完全一致,2021-04-27分组的匹配占比为40%,是所有分组中最高的。
场景适配调整
- 若需要非固定自然日的滑动时间窗口,直接替换分组逻辑为时间滚动窗口计算即可:
# 计算所有连续1天滑动窗口内的匹配占比 rolling_score = df["is_match"].rolling(window="1D").mean() # 定位占比最高的窗口位置,提取对应行即可 - 若需要增加其他匹配条件(比如Power列取值区间),直接在
is_match的布尔判断中追加&连接的条件即可,所有判断均为向量化执行,性能损耗极低。
性能说明:纯Python逐行遍历的运算逻辑在Python解释器层执行,类型判断、数值计算的常数项极高;上述方案所有核心运算均在C实现的NumPy/Pandas底层执行,相同时间复杂度下处理速度比手写循环快数十倍。
内容的提问来源于stack exchange,提问作者OAP
相关产品推荐
相关产品推荐

