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