如何在DataFrame中对action=1的指定列替换为按Feature分组的最小值?
Pandas实现按分组最小值替换指定行的目标列值
这个需求我帮你拆解一下:我们要找到action等于1的所有行,然后把这些行里的Value、Value Scaled、Zscore这三列的值,替换成它们所属Feature分组下对应列的最小值。下面给你两种实用的实现方式:
方法一:分组计算最小值 + 映射替换
先提前算出每个Feature分组下目标列的最小值,再通过映射把对应的值替换到指定行:
# 第一步:计算每个Feature分组下目标列的最小值 group_min = df.groupby('Feature')[['Value', 'Value Scaled', 'Zscore']].min() # 第二步:循环处理每个目标列,替换action=1的行 target_cols = ['Value', 'Value Scaled', 'Zscore'] for col in target_cols: # 用map根据Feature匹配对应的分组最小值,赋值给action=1的行 df.loc[df['action'] == 1, col] = df.loc[df['action'] == 1, 'Feature'].map(group_min[col])
这种方法逻辑清晰,适合刚接触Pandas的朋友理解,每一步都很直观。
方法二:用transform生成全量最小值列 + 批量替换
如果想更简洁,可以用transform直接生成每行对应的分组最小值,再批量替换:
target_cols = ['Value', 'Value Scaled', 'Zscore'] # 生成每行对应的分组最小值(和原DataFrame行数一致) min_per_row = df.groupby('Feature')[target_cols].transform('min') # 直接把action=1的行的目标列替换成对应的分组最小值 df.loc[df['action'] == 1, target_cols] = min_per_row.loc[df['action'] == 1]
transform会自动把分组后的结果广播到原DataFrame的每一行,这样就不用手动循环映射了,代码更简洁高效。
两种方法都能实现需求,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者kspr
相关产品推荐
相关产品推荐

