2016-02-19 1 views
3

У меня возникли проблемы с конкретной проблемой переформатирования данных в правильном формате.Преобразование Panda DataFrame в Panel-подобную структуру

У меня есть данные, как это:

Date   Hour Category Col1 Col2 
1/1/10 1:00 1 France 1.1 1.2 
1/1/10 2:00 2 France 2.9 1.4 
1/1/10 1:00 1 UK  3.8 2.3 
2/1/10 1:00 1 France 1.4 1.0 
2/1/10 1:00 1 UK  1.1 0.1 
2/1/10 2:00 2 UK  1.2 0.4 
3/1/10 1:00 1 France 0.5 0.6 

Что мне нужно в конце концов:

  • каждая строка должна соответствовать уникальной пары (категория + час)
  • Каждая строка содержит список Pd.Series (каждый Pd.series соответствует дате). Таким образом, длина списка соответствует количеству дней, которые соответствуют с (Категория + Hour)
  • Каждый элемент списка является pd.Series объект, содержащий другие значения

(Таким образом, это связанных с 3D-массив или панели, но количество элементов в списках может измениться)

выход будет что-то вроде этого:

Hour+Category Lists 
1+France   [[1/1/10 1.1 1.2] [2/1/10 1.4 1.0] [3/1/10 0.5 0.6]] 
2+France   [[1/1/10 2.9 1.4]] 
1+UK    [[1/1/10 3.8 2.3] [2/1/10 1.1 0.1] 
2+UK    [[2/1/10 1.2 0.4]] 

Мои первые попытки были:

X = X.group_by(['Hour','Category','Date']).first() 

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

X.to_panel() 

, которая создает 3D-панель, но где главная ось и малая ось являются Hour и категории. Else я мог бы попробовать

X.unstack(level = 2) 

иметь 2D массив с колонкой бытии (час + категория) и столбцов между (День + Col1, день + Col2), а затем удалите значения NA в каждой строке и сохранить только оставшиеся значения.

Но я все еще пытаюсь найти лучшее решение. я тоже думал что-то вроде этого, но я не могу заставить его работать:

X = X.group_by(['Hour','Category']).apply(lambda x : 
[pd.Series(dict(???)) ] 

Спасибо за вашу помощь.

ответ

0

Следующее кажется рабочим (вам нужно будет переименовать несколько столбцов и т. Д.), Но то, что вы хотели бы достичь, кажется мне странным - помещение данных в виде списка/массива внутри серии затрудняет работу использовать позже.

print df.groupby(['Hour', 'Category']).apply(lambda subdf : subdf[['Date','Col1','Col2']].values).reset_index() 

    Hour Category             0 
0  1 France [[1/1/10, 1.1, 1.2], [2/1/10, 1.4, 1.0], [3/1/... 
1  1  UK   [[1/1/10, 3.8, 2.3], [2/1/10, 1.1, 0.1]] 
2  2 France        [[1/1/10, 2.9, 1.4]] 
3  2  UK        [[2/1/10, 1.2, 0.4]] 
+0

Действительно, это работает! Большое спасибо. Мне нужен он в этом формате, чтобы подключить его к фонограммным библиотекам, таким как keras, которые запрашивают формат «списка последовательности». – cbournho