Python: Можете ли вы проверить, сколько раз уникальная комбинация значений двух столбцов появляется в другом фрейме данных?

#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') .