有没有一种简单的方法可以对 Pandas DataFrame 中的列进行分组?
Is there an easy way to group columns in a Pandas DataFrame?
我正在尝试使用 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 分数,或计算速度)。
不过,我想做的一件事是将上面显示的 "flat" 数据转换为在列(标记)上具有分层索引的格式,以便在级别 0(每个标记一个),并且每个级别在级别 1 都有 3 列(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
我知道如何通过加载平面文件然后直接操作 Series 对象来做到这一点,可能是通过使用 append
或者只是使用手动创建的 MultiIndex 创建一个新的 DataFrame。
作为一个Pandas学习者,感觉一定有一种方法可以用更少的努力做到这一点,但很难发现。有没有更简单的方法?
在您的情况下,您基本上只需要操作列名。
从您的原始 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
我正在尝试使用 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 分数,或计算速度)。
不过,我想做的一件事是将上面显示的 "flat" 数据转换为在列(标记)上具有分层索引的格式,以便在级别 0(每个标记一个),并且每个级别在级别 1 都有 3 列(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
我知道如何通过加载平面文件然后直接操作 Series 对象来做到这一点,可能是通过使用 append
或者只是使用手动创建的 MultiIndex 创建一个新的 DataFrame。
作为一个Pandas学习者,感觉一定有一种方法可以用更少的努力做到这一点,但很难发现。有没有更简单的方法?
在您的情况下,您基本上只需要操作列名。
从您的原始 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