Группировка ограниченных записей и остальная группа как другие - PullRequest
1 голос
/ 11 декабря 2019

Есть ли способ сгруппировать данные, такие как

df.Feature.value_counts(normalize=True)

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

Например, это вывод, который я получаю при запуске кода выше

NUEVO LEON          9.566025
ESTADO DE MEXICO    8.979984
TAMAULIPAS          7.939926
VERACRUZ            7.686035
DISTRITO FEDERAL    7.257108
COAHUILA            5.283328
JALISCO             4.835284
BAJA CALIFORNIA     4.280905
MICHOACAN           4.160830
GUANAJUATO          4.129765

И это вывод, который я ищу


NUEVO LEON          9.566025
ESTADO DE MEXICO    8.979984
TAMAULIPAS          7.939926
VERACRUZ            7.686035
DISTRITO FEDERAL    7.257108
OTHERS              24.56156

Ответы [ 3 ]

3 голосов
/ 11 декабря 2019

Я бы просто сделал это после value_counts, так как результат будет отсортирован по убыванию. Учитывая Серию s, результат df.Feature.value_counts(normalize=True), вы можете оставить первые 5, а затем сложить все остальное.

import pandas as pd

N = 5
pd.concat([s.iloc[:N], pd.Series(s.iloc[N:].sum(), index=['OTHERS'])])
#NUEVO LEON           9.566025
#ESTADO DE MEXICO     8.979984
#TAMAULIPAS           7.939926
#VERACRUZ             7.686035
#DISTRITO FEDERAL     7.257108
#OTHERS              22.690112
#dtype: float64
1 голос
/ 11 декабря 2019

Вы можете сделать что-то вроде:

import pandas as pd


sample_grouped = pd.DataFrame({'location': ["NUEVO LEON", "ESTADO DE MEXICO", "TAMAULIPAS", "VERACRUZ", "DISTRITO FEDERAL", "COAHUILA", "JALISCO", "BAJA CALIFORNIA", "MICHOACAN", "GUANAJUATO"],
                               'amount': [9.566025, 8.979984, 7.939926, 7.686035, 7.257108, 5.283328, 4.835284, 4.280905, 4.160830, 4.129765]})

top_5 = sample_grouped[:5]

others = sample_grouped[5:]

others_total = others.iloc[:,[1]].sum()[0]

result = pd.DataFrame.append(top_5, pd.DataFrame({'location': ['OTHERS'], 'amount': [others_total]}))
1 голос
/ 11 декабря 2019

Если вы в порядке с созданием временного столбца для этого, вы можете сделать:

# where keep_list = the list of values not in "other"
df['temp'] = df['Feature'].copy()
df.loc[~df['temp'].isin(keep_list), 'temp'] = 'Other'
df['temp'].value_counts(normalize=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...