Поворот кадра данных Pandas по дате и группе - PullRequest
0 голосов
/ 22 октября 2019

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


                            id_x  id_y
department         date               
0                  09/2017     1   NaN
1                  01/2018   149   NaN
                   01/2019   112   4.0
                   02/2018   103   1.0
                   02/2019    78   NaN
...                          ...   ...
799                09/2017    57   2.0
                   10/2017    64   3.0
                   11/2017    80   NaN
                   12/2017    79   2.0

Это результат фрейма данных, построенного из данных базы данных, в котором был выполнен ряд подсчетов, сгруппированных по отделу и дате.

Мне нужны эти данные, агрегированные как по отделу, так и по дате, однако я хочу, чтобы даты охватывали верхнюю часть, а затем число идентификаторов.

Мой желаемый результат - что-то вроде:

                              9/2017      10/2017
                            id_x   id_y  id_x   id_y
department 
0                              1   NaN    NaN   NaN
1                            NaN   NaN    NaN   NaN
...                          ...   ...    ...   ...
799                           57   2.0     64   3.0

Я пытался удалить индекс, переиндексировать, расплавить фрейм данных и повернуть фрейм данных. Я могу получить данные для упорядочения по «id_x» и «id_y», за которыми следуют даты, однако это не элегантное решение, поскольку оно потенциально повторяет 36 дат для каждого идентификатора.

Я ссылаюсь наследующий документ: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot.html

И протестировали варианты следующих решений (среди прочих):

new_df.melt(new_df, col_level=0, id_vars=['department'], value_vars=['id_x','id_y'])
new_df.reset_index().pivot_table(index="department", columns="date") #I've also tried "date" as values and in brackets outside the parenthesis

1 Ответ

2 голосов
/ 22 октября 2019

Восстановил ваши данные, но я думаю, что это поможет вам получить то, что вам нужно? Если поле даты было на самом деле datetime в вашей df, сортировка будет отображать фрейм данных в порядке возрастания даты.

df=pd.DataFrame({'department':[0,1,1,1,1,799,799,799,799],'date':['09/2017','01/2018','01/2019','02/2018','02/2019','09/2017','10/2017','11/2017','12/2017'],'id_x':[1,149,112,103,78,57,64,80,79],'id_y':[np.NaN,np.NaN,4.0,1.0,np.NaN,2.0,3.0,np.NaN,2.0]})


df=df.set_index('department')
df2=df.pivot(columns='date',values=['id_x','id_y'])        

df3=df2.swaplevel(axis=1)
df3.sort_index(axis=1, level=0, inplace=True)

Выход:

date       01/2018      01/2019      02/2018  ... 10/2017 11/2017      12/2017     
              id_x id_y    id_x id_y    id_x  ...    id_y    id_x id_y    id_x id_y
department                                    ...                                  
0              NaN  NaN     NaN  NaN     NaN  ...     NaN     NaN  NaN     NaN  NaN
1            149.0  NaN   112.0  4.0   103.0  ...     NaN     NaN  NaN     NaN  NaN
799            NaN  NaN     NaN  NaN     NaN  ...     3.0    80.0  NaN    79.0  2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...