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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:15:44