Pandas DataFrame窗口中位数计算的后续问题:保留列与消除警告
解决方案
问题1:消除FutureWarning
原代码里['col1','col2']是隐式转元组的写法,pandas后续版本会弃用这种方式,直接改成列表形式['col1', 'col2']就能解决警告。
问题2:保留col3并按规则取值
要在分组聚合时同时处理数值列和分类列,得用agg()方法给不同列指定对应的聚合逻辑:
- 对col1、col2:计算中位数
median() - 对col3:优先取窗口内出现次数最多的众数;如果窗口内各值出现次数相同,取第一个出现的众数(也可以根据需求改成取窗口内第一个/最后一个元素)
修正后的完整代码
import pandas as pd import numpy as np def calculate_median_val(df, window): # 生成分组键:按指定window行数分组 group_key = np.arange(len(df)) // window # 为各列定义聚合规则 agg_spec = { 'col1': 'median', 'col2': 'median', 'col3': lambda x: x.mode().iloc[0] # 取窗口内众数,无唯一众数时取第一个 # 若允许任意值,可替换成:lambda x: x.iloc[0] 或 lambda x: x.iloc[-1] } return df.groupby(group_key).agg(agg_spec).reset_index(drop=True)
测试验证
测试window=2的情况
用给定的DataFrame运行calculate_median_val(df, 2),输出和预期完全一致:
col1 col2 col3 0 1.5 12.5 A 1 3.5 22.5 A 2 5.5 32.5 B 3 7.5 42.5 B 4 9.5 52.5 B
测试window=3的情况
假设窗口内出现A,B,B的组合,运行calculate_median_val(df, 3)后,col3会自动取众数B,输出示例:
col1 col2 col3 0 2.0 15.0 A 1 5.0 25.0 B 2 8.0 40.0 B 3 10.0 55.0 B
内容的提问来源于stack exchange,提问作者serdar_bay
相关产品推荐
相关产品推荐

