Настройка нового макета с уникальными значениями нескольких столбцов из фрейма данных в Python - PullRequest
0 голосов
/ 12 ноября 2018

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

df = pd.DataFrame({ 'group' : ["A","A","A","B","B","B"],
           'unit_name' : ["BA234","BA744","BA240","BB237","BB740","BB27"],
           'value' :["50","10","180","10","10","660"],
           'set0' :["Country","Country","Country","Country","Country","Country"],
           'set_1' :["size1","size1","size2","size3","size4","size3"],
           'set_2' :["size12","size12","size12","size9","size13","size13"],
           'set_3' :["size14","size14","size15","NO","NO","NO"],
           'set_4' :["NO","NO","NO","Size25","Size25","Size27"],
           'set_5' :["NO","NO","NO","NO","NO","NO"]
                             })

Без жесткого кодирования:

Я хочу получить новый результирующий фрейм / макет данных, чтобы каждое значение столбца «группа» повторялось с уникальными значениями числа столбцов, связанных с «set_» (значения «NO» не должны учитываться), и выравнивалось по горизонтали.

Поскольку я не могу поделиться каким-либо изображением желаемого результата, я делюсь его транспонированной формой.

Полученный кадр данных должен выглядеть следующим образом:

df_new = pd.DataFrame({ 'Group' : ["A","A","A","A","A","A","B","B","B","B","B","B","B"],
           'sets' : ["Country","Size1","Size2","Size12","Size14","Size15","Country","Size3","Size4","Size9","Size13","Size25","Size27"],
                   })

Не могли бы вы помочь с вопросом?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

С pd.melt

import pandas as pd

(pd.melt(df, 
         id_vars='group', 
         value_name='Country', value_vars=[x for x in df.columns if 'set' in x])
   .drop(columns='variable')
   .drop_duplicates()
   .sort_values('group')
   .query('Country != "NO"')
)

Выход:

   group  Country
0      A  Country
6      A    size1
8      A    size2
12     A   size12
18     A   size14
20     A   size15
3      B  Country
9      B    size3
10     B    size4
15     B    size9
16     B   size13
27     B   Size25
29     B   Size27
0 голосов
/ 12 ноября 2018

Вы можете использовать следующее, которое stacks вашего фрейма данных, фильтруется там, где столбцы имеют set в имени, и удаляет дубликаты:

df_new = (df.set_index('group').replace('NO',np.nan)
          .filter(like='set').stack()
          .reset_index('group')
          .drop_duplicates())

>>> df_new
      group        0
set0      A  Country
set_1     A    size1
set_2     A   size12
set_3     A   size14
set_1     A    size2
set_3     A   size15
set0      B  Country
set_1     B    size3
set_2     B    size9
set_4     B   Size25
set_1     B    size4
set_2     B   size13
set_4     B   Size27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...