13

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

これを DataFrame に読み込むのは非常に簡単です。簡単な方法をいくつか学びました (たとえば、マーカー データを Z スコアに変換したり、速度を計算したりします)。

ただし、私がやりたいことの 1 つは、上記の「フラット」データを、列 (マーカー) に階層インデックスを持つ形式に変換して、レベル 0 に N 列 (マーカーごとに 1 つ) があるようにすることです。 )、そしてそれらのそれぞれには、レベル 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

appendフラット ファイルをロードしてから、手動で作成した MultiIndex を使用して新しい DataFrame を使用するか、単に作成することで、Series オブジェクトを直接操作することで、これを行う方法を知っています。

Pandas の学習者として、より少ない労力でこれを行う方法があるに違いないと感じていますが、それを見つけるのは困難です。もっと簡単な方法はありますか?

4

1 に答える 1

14

あなたの場合、基本的には列名を操作するだけです。

元の 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
于 2015-06-11T21:56:34.070 に答える