首页 > 解决方案 > 如何在 IQR 中将 pandas 中的值分别设置为列

问题描述

我想将 DataFrame 的值剪辑到它们的分位数范围内,以便:

  1. 如果实际值高于其第 75 个百分位,它将默认为第 75 个百分位值
  2. 如果实际值低于第 25 个百分位,则默认为第 25 个百分位。
  3. 如果该值介于第 25 和第 75 个百分位数之间,则它将是相同的值。

有没有办法一次性对所有列执行此操作(即 A 最大值变为 3,B 和 C 最大值变为 2.25)

test = pd.DataFrame({'A':[1,2,3,1,2,3,1,1,2,3,1,12],
                     'B':[0,1,2,1,0,1,3,1,2,1,3,9],
                     'C':[0,1,2,2,1,2,3,1,2,1,4,17]})

test.describe()


       A         B         C
25%    1.000000  1.000000  1.000000
75%    3.000000  2.250000  2.250000
max    12.000000 9.000000  17.000000

标签: python-3.xpandas

解决方案


我会for在列上循环:

for col in test:
    low,high = test[col].quantile([.25,.75])
    test[col] = test[col].clip(low,high)

print(test)

输出:

    A     B     C
0   1  1.00  1.00
1   2  1.00  1.00
2   3  2.00  2.00
3   1  1.00  2.00
4   2  1.00  1.00
5   3  1.00  2.00
6   1  2.25  2.25
7   1  1.00  1.00
8   2  2.00  2.00
9   3  1.00  1.00
10  1  2.25  2.25
11  3  2.25  2.25

更新 clip也适用于数据框:

thresh = test.quantile([.25,.75])
test.clip(lower=thresh.loc[.25], 
          upper=thresh.loc[.75],
          axis=1)

推荐阅读