动机:
我将三维速度数据存储在Nx3 DataFrame中。我需要检测数据中的事件并提取固定长度的时期以供进一步分析。我想将检测到的纪元存储为DataFrame中的附加索引/列,并使用它来获得跨所有3个维度的纪元数据的紧凑2d表示。我觉得应该可以通过df.stack
,df.unstack
,df.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,但是让所有索引/列标签自动排序会更好。
答案 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