Имитация SQL-соединений и подсчетов в Панд

#python #mysql #pandas #pandas-groupby

Вопрос:

Я пытаюсь решить проблему SQL-хакерранка с помощью Панд, и мне трудно понять, как ее решить. Вот в чем проблема:

https://www.hackerrank.com/challenges/the-company/problem

Фактически у меня есть 5 таблиц: компания, ведущий менеджер, старший менеджер, менеджер и сотрудник, и я должен определить количество разных менеджеров и сотрудников по идентификатору компании. Я скачал 5 таблиц и поместил их здесь в один файл, разделенный тире: https://pastebin.com/raw/iSbDzpfN Решение SQL выглядит следующим образом:

     SELECT DISTINCT C.company_code, C.founder, COUNT(DISTINCT LM.lead_manager_code),
    COUNT(DISTINCT SM.senior_manager_code), COUNT(DISTINCT M.manager_code), COUNT(DISTINCT E.employee_code)
    FROM Company AS C, Lead_Manager AS LM, Senior_Manager AS SM, Manager AS M, Employee AS E
    WHERE C.company_code=LM.company_code AND LM.lead_manager_code=SM.lead_manager_code AND
    SM.senior_manager_code=M.senior_manager_code AND M.manager_code = E.manager_code
    GROUP BY C.company_code
    ORDER BY C.company_code ASC;
 

После того, как я загружу таблицы и объединю первые 3 в переменную v:

     comp_df = pd.read_csv("mydata/company.csv", header=0).drop_duplicates()
    lead_df = pd.read_csv("mydata/lead_manager.csv", header=0).drop_duplicates()
    senior_df = pd.read_csv("mydata/senior_manager.csv", header=0).drop_duplicates()
    manager_df = pd.read_csv("mydata/manager.csv", header=0).drop_duplicates()
    emp_df = pd.read_csv("mydata/employee.csv", header=0).drop_duplicates()
    # Merge (or Join) first 3 tables
    v = comp_df.merge(lead_df, on="company_code", how="inner").merge(senior_df, on=["company_code", "lead_manager_code"])
 

И v выглядит так:

     #   company_code    founder lead_manager_code senior_manager_code
    0            C93      Jesse              LM93               SM135
    1            C46       Lori              LM46                SM65
    2            C46       Lori              LM46                SM66
    3            C98  Christine              LM98               SM141
     # ...
 

И ожидаемый результат имеет форму (но я только присоединяюсь к первым 3 таблицам для тестирования):

     C1 Angela 1 2 5 13 
    C10 Earl 1 1 2 3 
    C100 Aaron 1 2 4 10 
    C11 Robert 1 1 1 1 
    ...
 

Но когда я делаю группировку (например, используя только первые 2 таблицы:

     print(v.sort_values(by="company_code"))
 

Я получаю

     #                         lead_manager_code  senior_manager_code
    #company_code founder                                           
    C1           Angela                      2                    2
    C10          Earl                        1                    1
    C100         Aaron                       2                    2
    C11          Robert                      1                    1
    C12          Amy                         2                    2
 

Вместо подсчета уникальных значений для lead_manager_code и уникальных значений senior_manager_code, это просто подсчет общего количества строк для кода компании и основателя. Если я добавлю таблицы «Менеджер» и «сотрудник», все подсчеты будут равны общему количеству строк для каждого кода компании.

How can I do this?