#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