基于排序DataFrame的weather列众数插补:NA填充、非众数替换及平局处理
Pandas实现分组Weather列的特殊众数插补
需求回顾
对已按schoolid、grade、date、time_of_day排序的DataFrame stack_2,生成新列weather_mode_imputed:
- 若分组内
weather有唯一众数:将组内所有值(包括NA和非众数)替换为该众数 - 若分组内存在多个众数(平局):组内新列全部设为NA
- 保留原数据排序
代码实现
首先导入依赖:
import pandas as pd import numpy as np
定义分组处理函数:
def process_weather_mode(group): # 统计分组内各weather值的出现频次 freq = group['weather'].value_counts() max_freq = freq.max() # 筛选出所有达到最高频次的众数 top_values = freq[freq == max_freq].index.tolist() if len(top_values) == 1: # 唯一众数,全组替换为该值 group['weather_mode_imputed'] = top_values[0] else: # 多众数情况,全组设为NA group['weather_mode_imputed'] = np.nan return group
应用到目标DataFrame:
# 按指定列分组处理,group_keys=False避免分组键干扰原结构 stack_2_imputed = stack_2.groupby( ['schoolid', 'grade', 'date', 'time_of_day'], group_keys=False ).apply(process_weather_mode) # 确保排序与原数据完全一致(若分组后索引变动,执行此步骤) stack_2_imputed = stack_2_imputed.sort_index()
关键说明
- 众数判断逻辑:通过
value_counts()直接获取频次,比mode()更直观判断是否存在多个众数(mode()返回所有众数,但需额外处理长度) - 排序保留:原数据已按分组键排序,
groupby结合group_keys=False处理后,结果会保留原索引;若索引被打乱,sort_index()可快速恢复原排序 - NA处理:唯一众数场景下,原NA值会自动被替换为众数,无需额外填充操作
内容的提问来源于stack exchange,提问作者katie burford
相关产品推荐
相关产品推荐

