Найти столбцы в пределах определенного процентиля DataFrame - PullRequest
0 голосов
/ 28 сентября 2018

Имея многостолбцовый фрейм данных, меня интересует, как сохранить / получить часть фрейма данных, которая находится между 25-м и 75-м процентилями для каждого столбца?Мне нужно удалить строки (которые являются просто временными шагами), которые имеют значения вне диапазона 25-75 процентилей

import numpy as np
import pandas as pd   

df1 = pd.DataFrame({
       '400.0': [13.909261, 13.758734, 13.513627, 13.095409, 13.628918, 12.782643, 13.278548, 13.160153, 12.155895, 12.152373, 12.147820, 13.023997, 15.010729, 13.006050, 13.002356],
       '401.0': [14.581624, 14.173803, 13.757856, 14.223524, 14.695623, 13.818065, 13.300235, 13.173674, 14.145402, 14.144456, 13.142969, 13.022471, 14.010802, 14.006181, 14.002641],
       '402.0': [15.253988, 15.588872, 15.002085, 15.351638, 14.762327, 14.853486, 15.321922, 14.187195, 15.134910, 15.136539, 15.138118, 15.020945, 15.010875, 15.006313, 15.002927],
       '403.0': [15.633908, 14.833914, 15.146499, 15.431543, 15.798185, 14.874350, 14.333470, 14.192128, 15.130119, 15.134795, 15.136049, 15.019307, 15.012037, 15.006674, 15.003002],
       })

Я ожидаю увидеть меньшее количество строк, поэтому я должен исключить диапазонизмерения, которые действуют как выбросы временных рядов.

enter image description here

Это исходный набор данных, где на оси x показаны строки.Поэтому мне нужно каким-то образом удалить этот BLOB-объект, задав критерии процентили

В конце я бы взял самые строгие критерии, чтобы применить его ко всему фрейму данных

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Здесь будет гораздо быстрее работать с базовыми numpy массивами:

a = df1.values
q1 = np.quantile(a, q=0.25, axis=0)
q2 = np.quantile(a, q=0.75, axis=0)

mask = ((q1 < a) & (a < q2)).all(1)

df1[mask]

       400.0      401.0      402.0      403.0
8  12.155895  14.145402  15.134910  15.130119
9  12.152373  14.144456  15.136539  15.134795

Инвертировать маску (df[~mask]), если хотите исключить эти строки

0 голосов
/ 28 сентября 2018

Я не на 100% уверен, что это то, что вы хотите, но IIUC, вы можете создать маску, а затем применить ее к вашему фрейму данных.

df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).all(1)]

       400.0      401.0      402.0      403.0
8  12.155895  14.145402  15.134910  15.130119
9  12.152373  14.144456  15.136539  15.134795

Это приведет к удалению любой строки, содержащей любое значение в любом столбце, выходящем за пределы вашего диапазона.

Если вместо этого вы хотите удалить только те строки, которые содержат все значения, выходящие за пределы вашего диапазона, вы можете использовать:

df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).any(1)]

        400.0      401.0      402.0      403.0
2   13.513627  13.757856  15.002085  15.146499
3   13.095409  14.223524  15.351638  15.431543
5   12.782643  13.818065  14.853486  14.874350
6   13.278548  13.300235  15.321922  14.333470
7   13.160153  13.173674  14.187195  14.192128
8   12.155895  14.145402  15.134910  15.130119
9   12.152373  14.144456  15.136539  15.134795
10  12.147820  13.142969  15.138118  15.136049
11  13.023997  13.022471  15.020945  15.019307
12   0.010729  14.010802  15.010875  15.012037
13   0.006050  14.006181  15.006313  15.006674
14   0.002356  14.002641  15.002927  15.003002

Строки сохраняются здесь, если любой иззначения в любом столбце находятся в диапазоне процентилей в соответствующем столбце.

...