Python: извлечение нижнего квантиля из DataFrame - PullRequest
0 голосов
/ 04 марта 2020

У меня есть столбец данных, который представляет собой набор чисел в порядке убывания, и мне нужно назначить самый низкий% 10 для нового кадра данных. Но я не смог найти способ извлечь самый низкий% 10. Заранее спасибо.

Первая функция, которую я попробовал - percentile функция numpy.

import numpy as np
import pandas as pd


df['Column']` #which has 2400 number

array1 = np.array(df['Column'])

np.percentile(array1,10)` #gave me the variable which is the %10 (just 1 variable) but I need the list of lowest %10

Второй код, который я попробовал - cut функция pandas

pd.qcut(df['Column'], q =10) # divides the dataframe to 10 equal piece. But I couldn't find a way to extract lowest %10 

1 Ответ

1 голос
/ 04 марта 2020

Если вам нужно получить строки, которые удовлетворяют этому условию, вы можете сделать это с помощью простой нарезки. Давайте пройдемся по нему:

  1. Чтобы получить квантильный порог 10%, используйте df['Column'].quantile(0.1)
  2. Чтобы получить строки, в которых этот столбец ниже (или равен) этому порогу, используйте df['Column'].le(df['Column'].quantile(0.1)) (или эквивалентно, df['Column'] <= df['Column'].quantile(0.1)).
  3. Предыдущее выражение дало серию с индексом, соответствующим индексу df, и значениями True / False, где значения совпадают / не совпадают условие. Такая серия может быть передана в качестве индекса в df для фильтрации только нужных строк.

Чтобы подвести итог, вы хотите получить следующее:

df_2 = df[df['Column'].le(df['Column'].quantile(0.1))]

РЕДАКТИРОВАНИЕ: для верхних 10% аналогично используйте

df_2 = df[df['Column'].ge(df['Column'].quantile(0.9))]

РЕДАКТИРОВАНИЕ (снова , согласно комментарию OP):

Если вам нужно получить точное число (например, ровно 10% вашего набора данных, независимо от дублирующихся значений), вы можете отсортировать кадр данных по соответствующему столбцу и выбрать верхнюю часть / bottom n значения (где n может быть, например, df.shape [0] // 10), например:

df_2 = df.sort_values('Column').tail(df.shape[0]//10) # top 10%
df_2 = df.sort_values('Column').head(df.shape[0]//10) # bottom 10%
...