Панды Python: Сгруппируйте столбец по дубликатам и соедините строки в соответствующем столбце

#python #pandas #csv #pandas-groupby #data-science

Вопрос:

Я хочу сгруппировать или (сгруппировать) идентификаторы заголовков PO, а затем объединить строки (XML) для всех строк, где идентификаторы заголовков PO одинаковы. Я наткнулся на несколько примеров кода, но получал некоторые ошибки.

В конечном счете, столбец Final_XML-это то, чего я хочу достичь.

 PO Header ID   XML   Combined_XML
123           <test1> 
123           <test2> 
456           <test3> 
567           <test4> 
567           <test5> 
567           <test6> 

Desired output
PO Header ID   Combined_XML
123            <test1><test2>
456            <test3>
567            <test4><test5><test6>
 

Вот что я пробовал до сих пор:

     combineXML = df.groupby(['PO Header Id']).agg(['Combined_XML']).apply(list).reset_index()
    print(combineXML)
    Throws error: KeyError: 'PO Header Id' There are no spaces in the column name so I am not sure 
    why it is not working
    df = df.groupby(['PO Header Id','XML'])['Combined_XML'].apply(''.join).reset_index()
 

Комментарии:

1. Дайте мне знать, подходит ли вам мой ответ или требуется какая-либо тонкая настройка ? Спасибо!

2. Привет, Скотт, пожалуйста, сообщите, подходит ли вам мой ответ или требуется какая-либо тонкая настройка ? Спасибо!

Ответ №1:

Вы могли бы попробовать таким образом df.groupby(['PO Header ID'])['XML'].apply(''.join).reset_index()

Комментарии:

1. Файл «.Prepare-Data.py», строка 58, в groupPOsAndMergeXML combineXML = ДФ.метод groupBy([‘идентификатор по заголовку’])[‘XML-файле’].применить(«.присоединяйтесь).reset_index() файл «C:Program FilesPython37libsite-packagespandascoreframe.py», линия 7636, в метод groupBy dropna=dropna, файл «C:Program FilesPython37libsite-packagespandascoregroupbygroupby.py», линия 896, в инициализации dropna=самоуправления.dropna, файл «FilesPython37libsite-packagespandascoregroupbygrouper.py C:Program «, строка 860 в get_grouper поднять KeyError(ППГ) KeyError: ‘заголовок по идентификатору’

2. @Скотт, похоже, ошибка произошла из-за того, что ваша метка столбца на самом деле 'PO Header Id' 'PO Header ID' Id является ( а не ID ) тем, что вы опубликовали в качестве образцов данных. После исправления этого, это решение должно работать, за исключением того, что метка столбца не Combined_XML соответствует ожидаемому результату. Если вам нужна точная метка столбца, см. Мой ответ.

Ответ №2:

Вы можете использовать .GroupBy.agg() с именованной агрегацией следующим образом:

 combineXML = df.groupby('PO Header ID', as_index=False).agg(Combined_XML=('XML', ''.join))
 

или используйте следующее, если ваше имя столбца на самом деле PO Header Id :

 combineXML = df.groupby('PO Header Id', as_index=False).agg(Combined_XML=('XML', ''.join))
 

Результат:

 print(combineXML)


   PO Header ID           Combined_XML
0           123         <test1><test2>
1           456                <test3>
2           567  <test4><test5><test6>