Страницы

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

среда, 22 января 2020 г.

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

#python #pandas #dataframe


Написал код:

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 в таблице была одна?
    


Ответы

Ответ 1



Воспользуйтесь методом .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

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

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