2015-06-11 5 views
1

Я пытаюсь использовать Pandas для представления данных захвата движения, которые имеют T измерений местоположений (x, y, z) каждого из N маркеров. Например, при Т = 3 и N = 4, исходные данные CSV выглядит следующим образом:Есть ли простой способ группировки столбцов в Pandas DataFrame?

T,Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,Dx,Dy,Dz 
0,1,2,1,3,2,1,4,2,1,5,2,1 
1,8,2,3,3,2,9,9,1,3,4,9,1 
2,4,5,7,7,7,1,8,3,6,9,2,3 

Это действительно просто загрузить в DataFrame, и я узнал несколько трюков, которые легко (преобразующего маркер данные для z-оценок или вычислительные скорости, например).

Одна вещь, которую я хотел бы сделать, заключается в том, чтобы преобразовать «плоские» данные, показанные выше, в формат, который имеет иерархический индекс для столбца (маркера), так что на уровне 0 будет N столбцов (по одному для каждого маркера), и каждый из них будет иметь 3 столбца на уровне 1 (по одному для x, y и z).

A  B  C  D 
    x y z x y z x y z x y z 
0 1 2 1 3 2 1 4 2 1 5 2 1 
1 8 2 3 3 2 9 9 1 3 4 9 1 
2 4 5 7 7 7 1 8 3 6 9 2 3 

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

Как ученик Панды, он чувствует, что должен быть способ сделать это с меньшими усилиями, но его трудно обнаружить. Есть ли более простой способ?

+0

Вы также можете изучить использование MultiIndex, в зависимости от того, нужно ли вам делать multidimensi онльные преобразования. – smci

+0

Есть ли разница между иерархическим индексом и MultiIndex? – lmjohns3

+0

Я не использую его, читаю SO и pandas doc на нем. – smci

ответ

2

Вам в основном просто нужно управлять именами столбцов в вашем случае.

Начиная с оригинальной DataFrame (и крошечной манипуляцией индекса):

from StringIO import StringIO 
import numpy as np 
a = pd.read_csv(StringIO('T,Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,Dx,Dy,Dz\n\ 
    0,1,2,1,3,2,1,4,2,1,5,2,1\n\ 
    1,8,2,3,3,2,9,9,1,3,4,9,1\n\ 
    2,4,5,7,7,7,1,8,3,6,9,2,3')) 
a.set_index('T', inplace=True) 

Так что:

>> a 
Ax Ay Az Bx By Bz Cx Cy Cz Dx Dy Dz 
T            
0 1 2 1 3 2 1 4 2 1 5 2 1 
1 8 2 3 3 2 9 9 1 3 4 9 1 
2 4 5 7 7 7 1 8 3 6 9 2 3 

Тогда просто создать список кортежей для ваших колонок, и использовать MultiIndex.from_tuples:

a.columns = pd.MultiIndex.from_tuples([(c[0], c[1]) for c in a.columns]) 

>> a 
    A   B   C   D 
    x y z x y z x y z x y z 
T            
0 1 2 1 3 2 1 4 2 1 5 2 1 
1 8 2 3 3 2 9 9 1 3 4 9 1 
2 4 5 7 7 7 1 8 3 6 9 2 3 
+0

Хорошо! Мне не хватало, что я могу просто назначить новый индекс атрибуту столбцов. – lmjohns3

Смежные вопросы