Найти процент от общего количества категорий, отсортировать от наивысшего к низшему, сохранить имена 80% лучших и переименовать все остальные в «другие»

#python #pandas

#python #панды

Вопрос:

У меня есть набор данных, содержащий бренды продуктов в одном столбце и характеристики продукта в виде разных столбцов следующим образом:

 Brand      |Internal Memory|  Feature 2
-----------------------------------------
Apple      |16 GB          |    A
-----------------------------------------
Apple      |32 GB          |    B
-----------------------------------------
LG         |32 GB          |    C
-----------------------------------------
Samsung    |16 GB          |    B
-----------------------------------------
Samsung    |32 GB          |    A
-----------------------------------------
  

Я пытаюсь сделать следующее, используя python:

1) Найдите, какой процент данных принадлежит каждому бренду, в этом случае я бы получил что-то вроде:

 Apple: 40% 
LG: 20%
Samsung: 40%
  

2) Отсортируйте их от самого высокого к самому низкому проценту частоты

 Apple: 40%
Samsung: 40%
LG: 20%
  

3) Добавьте частоту каждой категории к следующей

 Apple: 40%
Samsung: 80%
LG: 100%
  

4) Переименуйте все категории после 80% в исходном наборе данных, чтобы получить что-то вроде:

 Brand      |Internal Memory|  Feature 2
-------------------------------------------
Apple      |16 GB          |    A
-------------------------------------------
Apple      |32 GB          |    B
-------------------------------------------
Other      |32 GB          |    C
-------------------------------------------
Samsung    |16 GB          |    B
-------------------------------------------
Samsung    |32 GB          |    A
-------------------------------------------
  

Я вручную выполнил эту операцию, но хотел бы сделать это на python

Я пытаюсь сделать это, используя python 3 и pandas, но я не против изучить разные библиотеки или методы.

Комментарии:

1. Что вы пытались сделать? Pandas был бы пакетом, который я бы использовал, чтобы сделать что-то подобное, используя их методы groupby .

2. Ваша цель — переименовать только последние 20%? Или эти промежуточные шаги также важны для вывода?

3. @MatthewBarlowe Я успешно отобразил таблицу, показывающую количество и соответствующий процент нулевых значений в столбце, используя следующий код, я думаю, что некоторые из них применимы к моей проблеме, но я не смог этого сделать. null_values = [(col, (count_nans (col, df_to_analyze)), (count_nans(col, df_to_analyze)/len(df_to_analyze.index)*100)) для col в df_to_analyze.columns] nulls_table = pd.DataFrame(null_values, столбцы = (‘Columna’, ‘#de Nulos’), ‘% de Nulos’)) отображение (nulls_table)

4. @Erfan Основная цель — переименовать последние 20%, было бы полезно отобразить промежуточные шаги, но они не нужны.

Ответ №1:

Чтобы воспроизвести ваши шаги, пошагово:

Сначала мы можем сопоставить value_counts наш Brand столбец, чтобы получить процентный столбец:

 df['Pct'] = df['Brand'].map(df['Brand'].value_counts(normalize=True).cumsum()) * 100

print(df)
     Brand Internal Memory Feature 2    Pct
0    Apple           16 GB         A   80.0
1    Apple           32 GB         B   80.0
2       LG           32 GB         C  100.0
3  Samsung           16 GB         B   40.0
4  Samsung           32 GB         A   40.0
  

После этого мы сортируем по возрастанию sort_values и сбрасываем наш индекс

 df.sort_values('Pct', inplace=True)
df.reset_index(drop=True, inplace=True)

print(df)
     Brand Internal Memory Feature 2    Pct
0  Samsung           16 GB         B   40.0
1  Samsung           32 GB         A   40.0
2    Apple           16 GB         A   80.0
3    Apple           32 GB         B   80.0
4       LG           32 GB         C  100.0
  

После этого мы используем np.where для условного заполнения Brand столбца, Other когда процент превышает 80:

 df['Brand'] = np.where(df['Pct'] > 80, 'Other', df['Brand'])

print(df)
     Brand Internal Memory Feature 2    Pct
0  Samsung           16 GB         B   40.0
1  Samsung           32 GB         A   40.0
2    Apple           16 GB         A   80.0
3    Apple           32 GB         B   80.0
4    Other           32 GB         C  100.0
  

При желании вы можете удалить Pct столбец:

 df.drop('Pct', axis=1, inplace=True)

print(df)
     Brand Internal Memory Feature 2
0  Samsung           16 GB         B
1  Samsung           32 GB         A
2    Apple           16 GB         A
3    Apple           32 GB         B
4    Other           32 GB         C
  

Комментарии:

1. Спасибо @Erfan! Кажется, это именно то, что мне нужно, я попробую это.

2. Это решение сработало отлично, еще раз спасибо @Erfan