lmj*_*ns3 4 columnname dataframe indices pandas
我正在尝试使用Pandas来表示运动捕获数据,该数据具有对N个标记的每个(x,y,z)位置的T测量。例如,在T = 3和N = 4的情况下,原始CSV数据如下所示:
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
Run Code Online (Sandbox Code Playgroud)
这真的很容易加载到DataFrame中,并且我学到了一些简单的技巧(例如,将标记数据转换为z分数或计算速度)。
不过,我想做的一件事是将上面显示的“平面”数据转换为一种在列(标记)上具有层次结构索引的格式,以便在级别0处有N列(每个标记一个) ),那么其中的每一个在级别1上都会有3列(x,y和z分别为1个)。
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
Run Code Online (Sandbox Code Playgroud)
我知道如何加载平面文件,然后直接操作Series对象,也许通过使用append手动创建的MultiIndex或仅使用新创建的DataFrame来实现。
作为熊猫的学习者,感觉必须有一种方法可以轻松完成此任务,但是很难发现。有没有更简单的方法?
基本上,您只需要对列名进行操作即可。
从原始的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)
Run Code Online (Sandbox Code Playgroud)
以便:
>> 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
Run Code Online (Sandbox Code Playgroud)
然后只需为您的列创建一个元组列表,并使用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
Run Code Online (Sandbox Code Playgroud)