在Python中删除异常值并计算具有不同实际值数量的多列的修剪平均值

问题描述 投票:0回答:1

我有一个数据集。假设有 10010 行和 100 列,列值可能包括 NaN,并且每列 NaN 可以不同。

附上不同行数和3列的样本数据集

我想要

  • 从该数据集中选取 n 个列(假设为 20,无顺序,例如 Column1、Column2 等)。
  • 修剪离群值(每个选定列的最高值的 2.5% 和最低值的 2.5%),不包括 NaN 值(因此,如果 Column1 中 10010 个值中有 10 个值是 NaN,我需要从顶部删除实际最高 250 个值, 10000 个值底部的 250 个实际最低值)
  • 但是,如果 Column2 最初有 110 NaN,我想从每一侧修剪 2.5%,以获得实际值的数量(在本例中为 9900,而不是像 Column1 列中的 10000)
  • 计算每个选定列的修剪平均值
  • 修剪后有一个新的数据集,其中所有修剪后的异常值都转换为 NaN
python pandas trim outliers
1个回答
0
投票

下面这个简化的示例展示了一种可能有用的方法,它使用 pd.quantile。可以根据您的要求开发代码(显然包括分位数参数)。

import pandas as pd

df = pd.DataFrame({'col1': [ 1, 2, 3, 4, None, 6, 7, 8, 54],
                   'col2': [11, 12, 13, 14, 15, 16, 17, 18, 19] })

col = 'col1'
lo = df[col].quantile(0.1)
hi = df[col].quantile(0.9)
df[col] = df[col].where((df[col]> lo) & (df[col] < hi), None)
mean_val = df[col].mean()


print(df)
print(mean_val)

给出:

   col1  col2
0   NaN    11
1   2.0    12
2   3.0    13
3   4.0    14
4   NaN    15
5   6.0    16
6   7.0    17
7   8.0    18
8   NaN    19

5.0
© www.soinside.com 2019 - 2024. All rights reserved.