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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:54:21