基于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
相关产品推荐
相关产品推荐

