Pandas:winsorize 每个组的特征离群值
Pandas: winsorize feature outliers for each group
我有一个包含 100 个特征的数据框,我想对每个 'group' 的异常值进行 winsorize。
您可以使用以下代码生成数据框。
import numpy as np
import pandas as pd
from scipy.stats import mstats
data = np.random.randint(1,999,size=(500,101))
cols = []
for i in range(101):
cols += [f'f_{i}']
df = pd.DataFrame(data, columns=cols)
df['group'] = np.random.randint(1,4,size=(500,1))
df = df.sort_values(by=['group'])
现在我想对每个组中的每个特征进行 winsorize(而不是删除!)极值。
如果您不确定'winsorize'。这是一个例子:
缩尾之前:
1, 2, 3, 4, 5 ... 97, 98, 99, 100
winsorize后最小和最大的1%:
2, 2, 3, 4, 5 ... 97, 98, 99, 99
我知道如何使用以下代码对整个数据帧的每个特征的极端 1% 值进行缩尾处理。
for col in df.columns:
df[col] = stats.mstats.winsorize(df[col], limits=[0.01, 0.01])
但是,我想对每个组的每个特征进行缩尾处理。
谁能指点一下?
谢谢!
一定有比这更优雅的方法,但它似乎对我有用,而且它只是对你的解决方案的一个小补充:
for col in df.columns:
for group in df.group.unique():
df[col][df.group==group] = mstats.winsorize(df[col][df.group==group], limits=[0.01, 0.01])
如您所见,除了列之外,我还遍历了组,并通过对每列进行简单过滤来解决问题。
我有一个包含 100 个特征的数据框,我想对每个 'group' 的异常值进行 winsorize。 您可以使用以下代码生成数据框。
import numpy as np
import pandas as pd
from scipy.stats import mstats
data = np.random.randint(1,999,size=(500,101))
cols = []
for i in range(101):
cols += [f'f_{i}']
df = pd.DataFrame(data, columns=cols)
df['group'] = np.random.randint(1,4,size=(500,1))
df = df.sort_values(by=['group'])
现在我想对每个组中的每个特征进行 winsorize(而不是删除!)极值。
如果您不确定'winsorize'。这是一个例子:
缩尾之前:
1, 2, 3, 4, 5 ... 97, 98, 99, 100
winsorize后最小和最大的1%:
2, 2, 3, 4, 5 ... 97, 98, 99, 99
我知道如何使用以下代码对整个数据帧的每个特征的极端 1% 值进行缩尾处理。
for col in df.columns:
df[col] = stats.mstats.winsorize(df[col], limits=[0.01, 0.01])
但是,我想对每个组的每个特征进行缩尾处理。
谁能指点一下? 谢谢!
一定有比这更优雅的方法,但它似乎对我有用,而且它只是对你的解决方案的一个小补充:
for col in df.columns:
for group in df.group.unique():
df[col][df.group==group] = mstats.winsorize(df[col][df.group==group], limits=[0.01, 0.01])
如您所见,除了列之外,我还遍历了组,并通过对每列进行简单过滤来解决问题。