【发布时间】:2021-03-14 13:05:42
【问题描述】:
请注意,不久前有人问过类似的问题,但从未得到回答(请参阅Winsorizing does not change the max value)。
我正在尝试使用来自scipy.stats.mstats 的winsorize 来winsorize 数据框中的一列。如果列中没有 NaN 值,则该过程正常运行。
但是,NaN 值似乎会阻止进程在分布的顶部(但不是底部)工作。无论我为nan_policy 设置什么值,NaN 值都设置为分布中的最大值。我觉得必须以某种方式错误地设置选项。
下面是一个示例,可用于在没有 NaN 值时重现正确的 Winsorizing 以及在存在 NaN 值时我遇到的问题行为。任何有关解决此问题的帮助将不胜感激。
#Import
import pandas as pd
import numpy as np
from scipy.stats.mstats import winsorize
# initialise data of lists.
data = {'Name':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'], 'Age':[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0]}
# Create 2 DataFrames
df = pd.DataFrame(data)
df2 = pd.DataFrame(data)
# Replace two values in 2nd DataFrame with np.nan
df2.loc[5,'Age'] = np.nan
df2.loc[8,'Age'] = np.nan
# Winsorize Age in both DataFrames
winsorize(df['Age'], limits=[0.1, 0.1], inplace = True, nan_policy='omit')
winsorize(df2['Age'], limits=[0.1, 0.1], inplace = True, nan_policy='omit')
# Check min and max values of Age in both DataFrames
print('Max/min value of Age from dataframe without NaN values')
print(df['Age'].max())
print(df['Age'].min())
print()
print('Max/min value of Age from dataframe with NaN values')
print(df2['Age'].max())
print(df2['Age'].min())
【问题讨论】:
-
看起来
nan_policy没有实际工作,因为它仍然是'propagates'的值,最后df2['Age']填充了所有值。 Winsorization 只不过是clipping,所以你可以用 pandas 轻松处理这个问题,这似乎正确地忽略了NaN
标签: python pandas dataframe numpy scipy