如何按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
相关产品推荐
相关产品推荐

