Я хотел вырезать значения DataFrame в их межкантильный диапазон, чтобы:

  1. Если фактическое значение выше 75-го процентиля, по умолчанию будет использоваться 75-й процентиль.
  2. Если фактическое значение ниже 25-го процентиля, по умолчанию будет использоваться 25-й процентиль.
  3. Если значение находится между 25-м и 75-м процентилем, оно будет таким же.

Есть ли способ сделать это для всех столбцов за один раз (т. Е. A max становится 3, B и C max становятся 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
2
Bartek Malysz 23 Окт 2019 в 00:13

1 ответ

Лучший ответ

Я бы сделал цикл 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)
4
Quang Hoang 22 Окт 2019 в 21:28