Процент отбрасывания данных [панды] - PullRequest
0 голосов
/ 28 июня 2018

У меня есть набор данных с очень длинным хвостом, и я хочу собрать только 90% данных.

city          score
bangkok       60
kl            20
sydney        10
melbourne     5
dhaka         5

должно быть:

city          score
bangkok       60
kl            20
sydney        10

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Сначала отсортируйте значения, по которым вы хотите отфильтровать самые высокие 90% данных

df.sort_values('score', ascending=False, inplace=True)

Затем вы вычисляете совокупную сумму и делите ее на общую сумму, чтобы выполнить условия фильтрации (вы можете заменить 0.9 на свой пользовательский лимит)

df = df[df['score'].cumsum() / df['score'].sum() < 0.9]

Теперь df выглядит как

city          score
bangkok       60
kl            20
sydney        10
0 голосов
/ 28 июня 2018

Я считаю, что нужно подсчитать счет путем деления sum, а затем отфильтровать по boolean indexing, последний sort_values для повышения производительности в отфильтрованных строках:

a = 0.9
df = df[df['score'].div(df['score'].sum()) >= 1 - a].sort_values('score', ascending=False) 

Или:

df = df[df['score'].div(df['score'].sum()) >= 0.1].sort_values('score', ascending=False) 

print (df)
      city  score
0  bangkok     60
1       kl     20
2   sydney     10

Деталь

print (df['score'].div(df['score'].sum()))
0    0.60
1    0.20
2    0.10
3    0.05
4    0.05
Name: score, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...