Обратите внимание, что аналогичный вопрос был задан некоторое время назад, но на него так и не ответили (см. Выигрыш не изменяет максимальное значение).
Я пытаюсь winsorize
столбца в кадре данных, используя winsorize
из scipy.stats.mstats
. Если в столбце нет значений NaN, процесс работает правильно.
Однако значения NaN, похоже, не позволяют процессу работать в верхней (но не в нижней) части распределения. Независимо от того, какое значение я установил для nan_policy
, значения NaN устанавливаются на максимальное значение в распределении. Я чувствую, что должен как-то неправильно установить параметр.
Ниже приведен пример, который можно использовать для воспроизведения как правильного винсоринга, когда нет значений NaN, так и проблемного поведения, с которым я сталкиваюсь, когда присутствуют значения 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
, поэтому вы можете легко справиться с этим с помощью панд, которые, кажется, правильно игнорируютNaN