【Python中应用Winsorize缩尾处理的心得】

最近搞数据时发现,缩尾时本来是空值或者无效值的地方被填补了数据。传统的研究会将空值剔除后再进行缩尾,但一些不需要剔除空值的数据集需要剔除极端值,因而不能省略缩尾。结合自己的操作经验做些记录:
以保存在Excel中的数据为例:

from scipy.stats.mstats import winsorize
import pandas as pd
df = pd.read_excel('Excel.xlsx', engine='openpyxl', header=0)
df_list=["a","b","c"]

1:直接应用Winsorize,不考虑空值和无效值,缩尾结果可能导致部分空值被填充数据

for i in df_list():
    df[i]=winsorize(df[i],limits=[0.01, 0.01])

2.1:屏蔽空值和无效值,仅对其他值进行Winsorize处理,缩尾结果不改变原来的空值和无效值

for i in df_list():
    df[i]=np.where(df[i].isnull(), np.nan, winsorize(np.ma.masked_invalid(df[i]),limits=(0.01,0.01)))

2.2:winsorize提供的参数,但这个方法我没有成功…仅供参考

for i in df_list():
    df[i]=winsorize(df[i],limits=[0.01, 0.01], nan_policy='omit')

【Python中应用Winsorize缩尾处理的心得】
3:屏蔽空值和无效值,对所有值进行Winsorize处理,缩尾结果不改变原来的空值和无效值, 与方法2的区别在于方法3没有改变需要缩尾的数据长度
for i in df_list():
    mask = df[i].notna()
    df.loc[mask,i] = winsorize(df[i].loc[mask],limits=[0.01, 0.01])

我碰到后续描述性统计有负无穷值的问题,因而将其替换为空值


df=df.replace(-np.Inf,np.NaN)

(在此鸣谢不厌其烦给我提供参考的张老师、李老师、孙老师!)
参考文章:
1.Winsorize的正确方法但在Python中忽略nan
2.有关numpy.ma.masked_invalid的用法
3.Python数据分析 – 缩尾处理

Original: https://blog.csdn.net/m0_53119847/article/details/122729777
Author: 啥都不懂的鳄鱼
Title: 【Python中应用Winsorize缩尾处理的心得】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/639808/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球