Страницы

Поиск по вопросам

воскресенье, 10 марта 2019 г.

Oбьединить две DataFrame таблицы, провести агрегацию данных с помощью pandas

Написал код:
array = pd.DataFrame(np.object, index=[], columns=[]) array = array.append({'Project': b.name, 'Summary': card.name, \ 'Key': card.id, 'Assignee': m, 'Points': s}, \ ignore_index=True) array1 = pd.read_excel('ProjectCostUCP.xlsx', 'Лист1') result = array[['Project', 'Assignee', 'Points']].groupby(['Project', 'Assignee']).sum(axis=1) print(result.columns.tolist()) result = result.merge(array1, on=['Project']) result['Value'] = result.Points * result.Price writer = pd.ExcelWriter('third.xlsx') array.to_excel(writer, "June") result.to_excel(writer, "June_agregation") writer.save()
Нужно обьединить две таблицы - result и array1 по наименованию колонки - 'Project'. Но, как показывает строчка print(result.columns.tolist()) в таблице result только одна колонка - 'Points'. Хотя до операции groupby() была еще и колонка 'Project'. groupby() поместил 'Project' в какой-то MultiIndex, с которого я не могу вытянуть данные. Помогите, пожалуйста, как исправить код, чтобы он заработал ? Конечным результатом работы кода, должна быть таблица:
Project Assignee Price Points Value srnd-demo Serhii 5,5 23 126,5
а после выполнения строчки
result = array[['Project', 'Assignee','Points']].groupby(['Project', 'Assignee']).sum(axis=1)
получается таблица:
Points Project Assignee srnd-demo Serhii 23
Points - оказались наименованием Columns, а Project Assignee попали в тип MultiIndex, с которым не возможно работать (а именно вытягивать с него данные) таблица array1 имеет вид:
Project Price srnd-demo 5.5
где Project Price - это название columns. Нужно обьединить таблицы result и array1 по названию columns Project, после чего перемножить Price на Points и поместить значение в колонку Value. Использование
result.reset_index().merge(array1)
привело к созданию таблицы:
Project Assignee Price_x Points Price_y 0 srnd-demo Serhii 5.5 23.0 5.5
Как добится, чтобы все-таки Price в таблице была одна?


Ответ

Воспользуйтесь методом .reset_index() чтобы превратить все столбцы индекса/мульти-индекса в обычные столбцы:
In [245]: result Out[245]: Points Project Assignee srnd-demo Serhii 23
In [246]: array1 Out[246]: Project Price 0 srnd-demo 5.5
In [247]: result.reset_index().merge(array1) Out[247]: Project Assignee Points Price 0 srnd-demo Serhii 23 5.5

UPDATE:
Если в DataFrame's присутствуют столбцы с одинаковыми наименованиями, которые не учавствуют в объединении (т.е. не были указаны в качестве параметра on, left_on, right_on), то в результате у этих столбцов появятся суффиксы (по умолчанию: '_x' - для левого DF и '_y' - для правого).
Пример:
In [259]: result Out[259]: Points Price Project Assignee srnd-demo Serhii 23 5.5
In [260]: array1 Out[260]: Project Price 0 srnd-demo 5.5
In [257]: result.reset_index().merge(array1, on='Project') Out[257]: Project Assignee Points Price_x Price_y 0 srnd-demo Serhii 23 5.5 5.5
избавьтесь от дублирующих столбцов в одном из DF:
In [258]: result.reset_index().merge(array1.drop(['Price'], axis=1), on='Project') Out[258]: Project Assignee Points Price 0 srnd-demo Serhii 23 5.5

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

Отправить комментарий