Преобразование сгруппированного pandas кадра данных (несколько, но не все столбцы) из длинного в широкий - PullRequest
1 голос
/ 08 февраля 2020

Проблема:

У меня есть набор данных с годовыми данными разных компаний. Данные хранятся в длинном формате, каждый год подряд, поэтому идентификаторы компании дублируются. Данные выглядят так (однако в исходном кадре данных у меня намного больше столбцов).

enter image description here

Мне нужно преобразовать формат длинного типа в широкий введите формат, чтобы каждая компания отображалась в одной строке (без дублирования)

Вот результат, на который я хотел бы выглядеть:

enter image description here

Как видите, мне нужно:

  • некоторые столбцы (например, "год") больше не нужны

  • некоторые столбцы (например, «sales», «sales_change_in_2_years», «sales_change_over_year») должны быть преобразованы из широкоформатного формата в длинный, сохраняя свои имена (и добавляя к ним число)

  • некоторые столбцы (например, «ind1» и «ind2») должны оставаться как есть (без преобразования из широкого в длинный)

До сих пор мне удавалось найти решение, которое работает только на одном столбце так что это действительно не решение для меня.

Это мой код:

test.groupby("comp_id")['sales_change_1'].apply(list).apply(pd.Series).rename(columns=lambda x: 'sales_{}'.format(x+1))

Есть ставка? тер решение моей проблемы?

1 Ответ

0 голосов
/ 08 февраля 2020

После сброса лет:

del test['Year']

Вы можете сгруппировать строки, добавив дополнительный столбец со строкой «index» для каждой строки, принадлежащей одной и той же компании.

test['idx'] = test.groupby('Comp_id').cumcount() + 1

Затем установите его как часть в качестве индекса DataFrame и используйте unstack(), чтобы превратить его в столбцы.

test = test.set_index(['Comp_id', 'idx']).unstack()

На этом этапе ваши столбцы будут мультииндексами с созданным 'idx' в качестве второго уровня, так что вы уже можете использовать DataFrame в том виде, в каком он стоит, ссылаясь на столбцы как ('Sales', 1), ('Sales', 2), et c.

Если вы хотите сгладить столбцы, используйте подчеркивание в качестве разделитель, вы можете сделать это с помощью:

test.columns = ['{}_{}'.format(col, idx) for (col, idx) in test.columns]
...