索引数据帧类似于具有2d索引的numpy ndarray

时间:2017-12-07 13:57:21

标签: python pandas indexing

动机:

我将三维速度数据存储在Nx3 DataFrame中。我需要检测数据中的事件并提取固定长度的时期以供进一步分析。我想将检测到的纪元存储为DataFrame中的附加索引/列,并使用它来获得跨所有3个维度的纪元数据的紧凑2d表示。我觉得应该可以通过df.stackdf.unstackdf.pivot之类的功能组合来实现这一点,但我无法解决如何做到这一点。

使用numpy数组我可以在数组中使用2d索引来执行类似这样的操作

>>> arr = np.arange(30).reshape((10, 3))

>>> arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23],
       [24, 25, 26],
       [27, 28, 29]])

>>> idx = np.array([[2, 5, 8],
                    [3, 6, 9]])

>>> np.concatenate(arr[idx].T).T
array([[ 6, 15, 24,  7, 16, 25,  8, 17, 26],
       [ 9, 18, 27, 10, 19, 28, 11, 20, 29]])

有没有一种很好的方法可以在pandas中做类似的事情,从像这样的数据框

>>> df = pd.DataFrame(arr, columns=['X', 'Y', 'Z'])
>>> df.index = [NaN, NaN, 0, 0, NaN, 1, 1, NaN, 2, 2]
>>> df
      X   Y   Z 
NaN   0   1   2
NaN   3   4   5
0     6   7   8
0     9  10  11
NaN  12  13  14
1    15  16  17
1    18  19  20
NaN  21  22  23
2    24  25  26
2    27  28  29

这样的事情?

   X           Y           Z
   0   1   2   0   1   2   0   1   2
0  6  15  24   7  16  25   8  17  26
1  9  18  27  10  19  28  11  20  29

当然,我可以使用numpy完成所有工作并从结果中创建一个新的DataFrame,但是让所有索引/列标签自动排序会更好。

1 个答案:

答案 0 :(得分:2)

考虑以下Pandas方法:

In [270]: x = df.loc[df.index.notnull()]

In [271]: x
Out[271]:
      X   Y   Z
0.0   6   7   8
0.0   9  10  11
1.0  15  16  17
1.0  18  19  20
2.0  24  25  26
2.0  27  28  29

In [278]: (x.set_index(np.arange(len(x)) // 2)
            .set_index(np.arange(len(x)) % 2, append=True)
            .unstack(0))
Out[278]:
   X           Y           Z
   0   1   2   0   1   2   0   1   2
0  6  15  24   7  16  25   8  17  26
1  9  18  27  10  19  28  11  20  29

或使用多索引:

In [305]: idx = pd.MultiIndex.from_product(([0,1,2],[0,1]))

In [306]: x.set_index(idx).unstack(0)
Out[306]:
   X           Y           Z
   0   1   2   0   1   2   0   1   2
0  6  15  24   7  16  25   8  17  26
1  9  18  27  10  19  28  11  20  29