如何对pandas DataFrame每行全列数据执行winsorize生成新列
pandas 逐行全字段winsorize缩尾处理实现方案
不需要逐列手动指定列名,也不需要做复杂的格式转换,pandas行对象自带的方法可以直接转成winsorize要求的列表输入格式。
- 先导入需要的依赖
from scipy.stats.mstats import winsorize import pandas as pd
- 核心实现逻辑
用apply方法指定axis=1即可按行遍历全表数据,每一行的Series对象调用.tolist()就能直接转成函数要求的列表格式,传入winsorize即可,处理结果直接赋值给新列:
# 双侧各10%水平缩尾,结果存入新列 df['winsorize_result'] = df.apply( lambda row: winsorize(row.tolist(), limits=[0.1, 0.1]), axis=1 )
- 适配场景补充
- 如果表中存在字符串、时间类非数值列,不需要手动列列名剔除,先自动筛选所有数值列参与计算即可:
# 自动提取所有数值类型列 num_cols = df.select_dtypes(include='number').columns df['winsorize_result'] = df[num_cols].apply( lambda row: winsorize(row.tolist(), limits=[0.1, 0.1]), axis=1 ) - 如果最终需要存储缩尾后的统计值(比如缩尾均值、缩尾标准差),直接在返回结果上调用对应方法即可,不需要额外存整个数组:
# 示例:存储逐行10%缩尾后的均值 df['winsorize_mean'] = df[num_cols].apply( lambda row: winsorize(row.tolist(), limits=[0.1, 0.1]).mean(), axis=1 )
- 如果表中存在字符串、时间类非数值列,不需要手动列列名剔除,先自动筛选所有数值列参与计算即可:
注意:如果数据集行数非常大(十万级以上),apply按行遍历的速度会偏慢,可以换用numpy向量化操作提速,但百列级、万行级规模下上面的写法完全够用,代码可读性也更高。
内容的提问来源于stack exchange,提问作者Roxanne
相关产品推荐
相关产品推荐

