Pandas Complex GroupBy и применить к набору данных машинного обучения - PullRequest
0 голосов
/ 24 сентября 2019

Доброе утро, у меня есть набор данных, который я использую для набора данных машинного обучения.Мой фрейм данных указан ниже.dataframe = df

      memid     year     code1     code2    ....... n amount of columns
        1       2014      8888      654
        2       2016      13456     4353
        2       2016      12345     3333
        1       2014      123333    1111 
        1       2016      55555     2222 
        1       2016      99999     2222 

Моя цель - свернуть набор данных и добавить год в качестве меры в именах столбцов ко всему фрейму данных (т. е. n количество столбцов). Моя структура таблицы ниже - моя цель

Ниже приведен кадр данных цели

 memid    code1_2014     code1_2015     code1_2016      code2_2014       code2_2015     code2_2016
   1      8888, 123333                  55555, 99999     654, 1111                          2222
   2                                    13456, 12345                                     4353, 3333                  

цель этого кода - получить указанную выше структуру столбцов для всех столбцов в наборе данных, кроме memid.Я знаю, что это сложный метод groupby и .apply или join, однако я не могу достичь цели.

Пожалуйста, помогите!Спасибо!

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

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

grpd_vals = df.pivot_table(
    index='memid',
    columns='year',
    aggfunc=lambda x: ','.join(str(i) for i in x.values)
).unstack().to_frame().reset_index()

дает:

enter image description here

Затем создайте столбец для хранения новых имен столбцов:

grpd_vals['col'] = grpd_vals['level_0'] + '_'+grpd_vals['year'].astype(str)

, затем снова сгруппируйте:

grpd_vals.pivot_table(
    index='memid',
    columns='col',
    values=0,
    aggfunc=lambda x: x
)

, что дает:

enter image description here

0 голосов
/ 24 сентября 2019

Может быть не так просто, как раньше, но вот моя попытка.

grouped = pd.DataFrame(df1.groupby(['memid','year']).aggregate(lambda x: list(x))) grouped.columns = ['_'.join(str(i)) for i in list(grouped.index.values)] grouped = grouped.reset_index(level= 1, drop=True) final = grouped.groupby(grouped.index).aggregate(lambda x: [item for sublist in x for item in sublist])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...