Используйте pandas groupby для поиска уникальных комбинаций столбцов и сохранения как df

#python #pandas #dataframe #group-by

Вопрос:

У меня есть следующий фрейм данных панд:

 df = pd.DataFrame({'Colors': ['blue', 'blue', 'orange', 'red',  'purple', 'orange', 'purple', 'blue', 'brown'],   'Price': ['500', '500', '200', '250', '300', '765', '1100', '762',   '650', '625'],  'Style': ['farm', 'contemporary', 'modern', 'MDM', 'MDM',   'contemporary', 'farm', 'contemporary', 'farm'],  'Location': ['far', 'near', 'far', 'far', 'near', 'far', 'far', 'near',   'far']})  

Я могу сделать df.groupby(['Colors', 'Price', 'Style', 'Location']).size() , чтобы получить разбивку по цвету, чтобы увидеть уникальные комбинации цены, стиля и местоположения, чтобы цвет возвращался в виде серии.

Вопрос — как я могу использовать это для создания нового фрейма данных pandas, где каждый столбец соответствует цвету (синий, Оранжевый, Красный и т.д.) и уникальным комбинациям значений (500_contemporary_near, 500_farm_far и т.д.)?

Примером вывода, который я пытаюсь сгенерировать, является фрейм данных, в котором есть столбец под названием «Синий», и каждое значение под (каждой строкой) — это строки, такие как 500_contemporary_near.

Синий

500_contemporary_near
500_farm_far

Ответ №1:

Вы можете сделать unstack

 df.groupby(['Colors', 'Price', 'Style', 'Location']).size().unstack(level=0)  

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

1. Я пытался это сделать, но это не совсем то, что я собираюсь сделать. Я хотел бы создать новый фрейм данных, в котором для данного цвета есть столбец для цвета (т. Е. Синий), а каждая строка внизу представляет собой уникальную строку его функций (500_contemporary_near). Таким образом, в конечном итоге столбцы являются цветами, а строки соответствуют уникальным строковым функциям для данного цвета.

2. @MAsoccer9 присоединяется ли строка, а затем группируется ~

3. Не могли бы вы привести наглядный пример?

Ответ №2:

Как насчет этого:

 pd.DataFrame([{k[0]: '_'.join(k[1:])} for k in   df.groupby(['Colors','Price', 'Style', 'Location']).groups]).fillna('')    blue brown orange purple red 0 500_contemporary_near  1 500_farm_far  2 762_contemporary_near  3 650_farm_far  4 200_modern_far  5 765_contemporary_far  6 1100_farm_far  7 300_MDM_near  8 250_MDM_far  

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

1. Это ближе к тому, чего я пытаюсь достичь. При такой реализации 500_contemporary_near, 500_farm_far и 762_contemporary_near находятся в одном столбце «Синий», а 650_farm_far находится в столбце «Коричневый» и так далее? Это правда?

2. Да, это верно