Группировать и суммировать данные по общему префиксу из значения столбца с префиксами различной длины и несовместимыми разделителями в кадре данных Pandas - PullRequest
2 голосов
/ 25 марта 2020

Я новичок в использовании 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 в новый список, и для каждого элемента в этом списке создать новую сводную таблицу. , Но я не знаю, сработает ли это, и я хочу знать, есть ли лучший или более эффективный способ сделать это, прежде чем пытаться.

1 Ответ

2 голосов
/ 25 марта 2020

вы можете использовать groupby.agg после удаления дубликатов и использовать series.str.split с первой строкой из разделения .str[0] в качестве группировщика:

d= {'Company_Name':'first','2019_Amt':'sum','2019_Amt':'sum',
               '2020_Amt':'sum','Code':'first','Flag':'first'}
grouper = df['Company_Name'].str.split().str[0]

out = df.drop_duplicates().groupby(grouper).agg(d).reset_index(drop=True)
print(out)

               Company_Name  2019_Amt  2020_Amt Code Flag
0           ABC Company Ltd      2000       400    A    Y
1  DEFGHIJ Company (London)      2580      1800    B    N
2              KLM Services      9000      7000    A    Y
3           NOPQ Industries      7300      8400    C    Y
...