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

基于Pandas DataFrame分组并按众数条件过滤数据

嘿,这需求我明白啦——从原来的「列值差异范围不超3」改成「只保留分组内所有值都和该分组众数一致」的组对吧?按name、driverRef、tyre分组后过滤,下面给你具体的实现步骤和代码:

核心思路

我们需要先给每个分组计算目标列的众数,然后检查该分组内的所有值是否都等于这个众数,最后只保留符合条件的分组数据。

代码实现

假设你的目标列是target_col(记得换成你实际要用的列名),具体代码如下:

import pandas as pd

# 先模拟一个示例DataFrame(你可以替换成自己的真实数据)
data = {
    'name': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'driverRef': ['X', 'X', 'X', 'Y', 'Y', 'Z', 'Z', 'Z'],
    'tyre': ['soft', 'soft', 'soft', 'hard', 'hard', 'medium', 'medium', 'medium'],
    'target_col': [10, 12, 13, 5, 5, 7, 7, 8]
}
df = pd.DataFrame(data)

# 1. 计算每个分组的众数(如果分组有多个众数,这里取第一个;需要其他逻辑可以调整)
grouped = df.groupby(['name', 'driverRef', 'tyre'])['target_col']
group_mode = grouped.apply(lambda x: x.mode().iloc[0] if not x.mode().empty else None)

# 2. 标记每个分组是否所有值都等于该分组的众数
valid_groups = grouped.apply(lambda x: all(x == x.mode().iloc[0]) if not x.mode().empty else False)
# 筛选出有效的分组键
valid_group_keys = valid_groups[valid_groups].index

# 3. 从原DataFrame中提取符合条件的分组数据
result_df = df[df.set_index(['name', 'driverRef', 'tyre']).index.isin(valid_group_keys)]

print(result_df)

代码说明

  • 众数计算:用x.mode()获取分组的众数,iloc[0]是处理分组存在多个众数的情况(比如某分组值为[5,5,7,7],众数有两个,这里默认取第一个,你可以根据需求修改,比如要求所有值必须匹配所有众数,但这种场景比较少见)。
  • 分组有效性判断:all(x == x.mode().iloc[0])检查分组内每一行的目标列值是否都等于众数,返回True/False标记分组是否有效。
  • 数据筛选:通过索引匹配,把原DataFrame中属于有效分组的行筛选出来,得到最终结果。

特殊情况处理

  • 如果分组只有一个值:众数就是它本身,会被自动保留。
  • 如果分组为空:代码里加了if not x.mode().empty的判断,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:09:16