Я новичок в использовании Python и Pandas, но пытаюсь автоматизировать некоторые операции очистки / объединения данных для моих отчетов. До сих пор я успешно создавал объединенный файл со всей информацией, которую мне нужно было включить в сводку отчетов, но я застрял в группировке и объединении данных с соответствующими префиксами.
У меня есть набор данных, который структурированный аналогично этому в pandas фрейме данных:
Company_Num Company_Name 2019_Amt 2020_Amt Code Flag Manager
1 ABC Company Ltd 2000 400 A Y John
1 ABC Company Ltd 2000 400 A Y John
2 DEFGHIJ Company (London) 480 100 B N James
3 DEFGHIJ Company (Bristol) 600 700 B N James
4 DEFGHIJ Company (York) 1500 1000 B N James
5 KLM Services 9000 7000 A Y Jane
6 NOPQ Industries 300 400 C Y Jen
7 NOPQ Industries - London 7000 8000 C Y Jen
Я хочу получить сводный набор данных, где в моих данных нет дубликатов, и вместо строк для каждого офиса у меня есть один Суммарная стоимость для каждой компании. В конечном итоге с таким фреймом данных, как:
Company_Name 2019_Amt 2020_Amt Code Flag
ABC Company Ltd 2000 400 A Y
DEFGHIJ Company 2580 1800 B N
KLM Services 9000 7000 A Y
NOPQ Industries 7300 8400 C Y
Пока мне удалось отбросить дубликаты, используя:
df.drop_duplicates(subset=['Company_Num', 'Company_Name', 'Code', '2019_Amt', '2020_Amt'])
С полученной таблицей:
Company_Num Company_Name 2019_Amt 2020_Amt Code Flag Manager
1 ABC Company Ltd 2000 400 A Y John
2 DEFGHIJ Company (London) 480 100 B N James
3 DEFGHIJ Company (Bristol) 600 700 B N James
4 DEFGHIJ Company (York) 1500 1000 B N James
5 KLM Services 9000 7000 A Y Jane
6 NOPQ Industries 300 400 C Y Jen
7 NOPQ Industries - London 7000 8000 C Y Jen
Решение, которое я попробовал, состоит в том, чтобы подставить первые 9 символов названия каждой компании и использовать для них групповую сумму и сумму, но в этом случае столбец сохраняется в качестве подстроки. Это также убрало столбцы Код и Флаг из моего фрейма данных, оставив меня с таблицей, подобной этой:
df['SubString_Company_Name'] = df['Company_Name'].str.slice(0,9)
df.groupby([df.SubString_Company_Name]).sum().reset_index()
SubString_Company_Name 2019_Amt 2020_Amt
ABC Compa 2000 400
DEFGHIJ C 2580 1800
KLM Servi 9000 7000
NOPQ Indu 7300 8400
Я пытался использовать функцию os.path.commonprefix для получения названий компаний, но не могу найти способ использовать его в кадре данных и для нескольких значений. Насколько я понимаю, он будет смотреть на список в целом и возвращать самый длинный общий префикс из всего списка, который не будет работать. Я также рассмотрел извлечение всех дублированных подстрок в новые кадры данных и суммирование и переименование там перед объединением в один набор данных, но я не уверен, сработает ли это. Решения, которые я нашел в Интернете, были сосредоточены вокруг единообразных данных, где лямбда-символы могут использоваться с разделителем, или префикс всегда имеет одинаковый размер, тогда как мои данные не являются единообразными, а префиксы имеют разные размеры.
My данные меняются каждый месяц, и поэтому я хочу разработать динамическое решение c, которое не полагается на подстроки, так как я мог столкнуться с проблемами с использованием только 9 символов. Последнее, что я хочу сделать, - это извлечь SubString_Company_Name в список, преобразовать его в os.path.commonprefix для Company_Name, а затем сохранить уникальное значение commonprefix каждого Company_Name в новый список, и для каждого элемента в этом списке создать новую сводную таблицу. , Но я не знаю, сработает ли это, и я хочу знать, есть ли лучший или более эффективный способ сделать это, прежде чем пытаться.