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

2024-04-26 00:08:14 发布

您现在位置:Python中文网/ 问答频道 /正文

动机:

我有一个Nx3数据帧中存储的三维速度数据。我需要检测数据中的事件,并提取固定长度的epoch进行进一步分析。我想将检测到的epoch存储为DataFrame中的一个附加索引/列,并使用它在所有3个维度上获得epoch数据的紧凑的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]])

有没有一个很好的方法可以在熊猫身上做类似的事情,从这样的数据帧开始

>>> 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,但是如果所有的索引/列标签都能自动排序,那就太好了。你知道吗


Tags: 数据numpydataframedfnp事件数组nan
1条回答
网友
1楼 · 发布于 2024-04-26 00:08:14

考虑以下方法:

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

相关问题 更多 >