#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?