有没有一种简单的方法可以对 Pandas DataFrame 中的列进行分组?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以对 Pandas DataFrame 中的列进行分组?【英文标题】:Is there an easy way to group columns in a Pandas DataFrame? 【发布时间】:2015-08-27 19:13:07 【问题描述】:

我正在尝试使用 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 分数或计算速度)。

不过,我想做的一件事是将上面显示的“平面”数据转换为在列(标记)上具有分层索引的格式,以便在级别 0 有 N 列(一个对于每个标记),并且每个标记在 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 的学习者,感觉必须有一种方法可以更轻松地做到这一点,但很难发现。有没有更简单的方法?

【问题讨论】:

您也可以考虑使用 MultiIndex,这取决于您是否需要进行多维转换。 分层索引和MultiIndex有区别吗? 我不使用它,阅读SO和pandas doc就可以了。 【参考方案1】:

在你的情况下,你基本上只需要操作列名。

从您的原始 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

【讨论】:

好的!我错过了我可以为 columns 属性分配一个新索引。

以上是关于有没有一种简单的方法可以对 Pandas DataFrame 中的列进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法来手动迭代现有的 pandas groupby 对象?

有没有一种快速的方法可以将 pandas DataFrame 变成漂亮的 HTML 表格?

用熊猫自信编程

有没有一种简单的方法可以在 tensorflow 中使用 tf.data.Dataset.from_generator 和自定义 model_fn(Estimator) 中的功能

将“pandas.get_dummies”转换到新数据的简单方法?

有没有一种简单的方法可以按字母顺序对字符串中的字符进行排序