Pandas DataFrame按多列分组查找D列中位数最接近值并标注实现方案
Pandas分组标注指定行实现方案
以下是满足需求的完整可运行代码,逻辑如下:
- 按
A、B、C三列分组,计算每组D列的中位数 - 筛选出每组中
D值大于等于中位数的记录,计算其与中位数的差值 - 定位每组中差值最小的行,对对应行的
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
相关产品推荐
相关产品推荐

