python-3.x - 如何在 IQR 中将 pandas 中的值分别设置为列
问题描述
我想将 DataFrame 的值剪辑到它们的分位数范围内,以便:
- 如果实际值高于其第 75 个百分位,它将默认为第 75 个百分位值
- 如果实际值低于第 25 个百分位,则默认为第 25 个百分位。
- 如果该值介于第 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
解决方案
我会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)