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

Pandas DataFrame按多列分组查找D列中位数最接近值并标注实现方案

Pandas分组标注指定行实现方案

以下是满足需求的完整可运行代码,逻辑如下:

  1. 按A、B、C三列分组,计算每组D列的中位数
  2. 筛选出每组中D值大于等于中位数的记录,计算其与中位数的差值
  3. 定位每组中差值最小的行,对对应行的Next_Med列标记为1,其余为0
import pandas as pd
import numpy as np

# 构造示例数据
data = {
    'A': ['a'] * 10,
    'B': ['b', 'b', 'b', 'b', 'b', 'c', 'c', 'e', 'd', 'd'],
    'C': [-1, -1, -1, -1, 0, -1, 1, 1, -1, -1],
    'D': [3.5, 52, 2, 0, 15, 1612, 17, 52, 412, 532]
}
df = pd.DataFrame(data)

# 计算分组中位数
df['group_median'] = df.groupby(['A', 'B', 'C'])['D'].transform('median')
# 仅对大于等于中位数的记录计算差值
df['diff'] = np.where(df['D'] >= df['group_median'], df['D'] - df['group_median'], np.nan)
# 定位每组差值最小的行索引
target_idx = df.groupby(['A', 'B', 'C'])['diff'].idxmin()
# 生成标注列
df['Next_Med'] = 0
df.loc[target_idx, 'Next_Med'] = 1
# 删除中间辅助列
df = df.drop(columns=['group_median', 'diff'])

print(df)

运行后输出结果和你给出的预期完全一致。如果遇到同组内有多个行和中位数差值相同的场景,可将定位目标行的逻辑修改为标记所有符合条件的行:

# 替换定位索引的步骤,标记所有差值等于组内最小差值的行
df['min_diff'] = df.groupby(['A', 'B', 'C'])['diff'].transform('min')
df['Next_Med'] = np.where(df['diff'] == df['min_diff'], 1, 0)
df = df.drop(columns=['group_median', 'diff', 'min_diff'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:00:00