#python #pandas #dataframe #merge #apply
#питон #панды #фрейм данных #слияние #применить
Вопрос:
Я пытаюсь увидеть, сколько раз уникальная комбинация значений двух столбцов появляется в другом фрейме данных, и добавить ее как новый столбец с одной строкой. У меня есть справочная таблица, в которой рассматриваются уникальные комбинации полей ID
и. Desc
У меня также есть таблица, в которой есть все активные вхождения этих комбинаций
ref_table active_data
ID Desc ID Desc
0 1 Windows 0 1 Windows
1 1 Linux 1 1 Windows
2 2 Linux 2 1 Linux
3 3 Network 3 2 Linux
4 4 Automation 4 3 Network
5 3 Network
6 3 Network
7 4 Automation
Я хотел бы добавить к ref_table
подсчету уникальных комбинаций полей ID
и Desc
, которые отображаются active_data
примерно так:
ref_table
ID Desc Count
0 1 Windows 2
1 1 Linux 1
2 2 Linux 1
3 3 Network 3
4 4 Automation 1
Я признаю , что этого можно достичь , выполнив pd.merge
или join
. Однако, если возможно, я хотел бы сделать это с помощью одной строки, и если бы меня интересовало только количество одного столбца, например ID
, я знаю, что это можно сделать с помощью:
ref_table['Count'] = ref_table['ID'].map(active_data['ID'].value_counts())
.
Попытка расширить это, чтобы просмотреть оба столбца ID
и Desc
, используя:
ref_table['Count'] = ref_table[['ID', 'Desc']].apply(active_data[['ID', 'Desc']].value_counts())
выдает ошибку, KeyError: "None of [Index([3, 'Network'], dtype='object')] are in the [index]"
. В идеале я хотел бы использовать решение value_counts, но не могу понять это с помощью двух столбцов.
Ответ №1:
Вы можете сделать merge
вкл. groupby
:
ref_table.merge(active_data.groupby(['ID','Desc'], as_index=False)['ID'].count(),
on=['ID','Desc'], how='left')
Или вы можете merge
, тогда groupby
:
(ref_table.merge(active_data, on=['ID','Desc'], how='left')
.groupby(['ID','Desc'])['ID'].count()
.reset_index('Count')
)
Комментарии:
1. Я считаю, что первое решение просто возвращает уникальные комбинации, которые снова отображаются в
active_data
таблице, но не количество. Второе решение, похоже, работает после внесения изменений в.reset_index(name='Count')
.