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

如何按colony分组用最大值填充measure列NaN并同步处理关联列及添加备注

Pandas 分组填充与状态标记实现

问题说明

给定如下初始DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "colony": [22, 22, 22, 33, 33, 33],
    "measure": [np.nan, 7, 11, 13, np.nan, 9],
    "net/gross": [np.nan, "gross", "net", "gross", np.nan, "net"]
})

初始数据展示:

colony  measure net/gross
0      22      NaN       NaN
1      22      7.0      gross
2      22     11.0        net
3      33     13.0      gross
4      33      NaN       NaN
5      33      9.0        net

需要完成三项操作:

  • 按colony分组,用每组measure的最大值填充该列的缺失值;
  • 将net/gross列的缺失值,替换为对应组measure最大值所在行的net/gross值;
  • 添加remarks列,标记所有被填充过缺失值的行为max_filled,未修改的行标记为unchanged。

解决方案代码

# 先记录原始缺失值的位置,后续用于标记
has_na_measure = df['measure'].isna()
has_na_netgross = df['net/gross'].isna()

# 1. 按colony分组,计算每组measure的最大值并填充缺失值
group_measure_max = df.groupby('colony')['measure'].transform('max')
df['measure'] = df['measure'].fillna(group_measure_max)

# 2. 获取每组measure最大值对应的net/gross值
max_netgross_map = df.groupby('colony').apply(
    lambda g: g.loc[g['measure'].idxmax(), 'net/gross']
).to_dict()

# 填充net/gross的缺失值
df['net/gross'] = df['net/gross'].fillna(df['colony'].map(max_netgross_map))

# 3. 添加remarks列
df['remarks'] = np.where(
    has_na_measure | has_na_netgross,
    'max_filled',
    'unchanged'
)

# 输出结果
print(df)

最终输出

colony  measure net/gross      remarks
0      22     11.0        net  max_filled
1      22      7.0      gross    unchanged
2      22     11.0        net    unchanged
3      33     13.0      gross    unchanged
4      33     13.0      gross  max_filled
5      33      9.0        net    unchanged

关键步骤解释

  • 记录原始缺失状态:提前保存两列的缺失值位置,避免填充后无法追溯哪些行被修改过;
  • 分组填充measure:使用transform方法将每组的最大值广播到组内所有行,快速完成缺失值填充;
  • 映射net/gross值:通过idxmax找到每组measure最大值的索引,提取对应net/gross值后,用map方法填充该组的缺失值;
  • 标记修改状态:只要原始行存在任一缺失值(即被填充过),就标记为max_filled,否则保持unchanged。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:12