设置:
pdf = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
pdf['a'][2:]=pdf['a'][0]
pdf['a'][:2]=pdf['a'][1]
pdf.set_index(['a','b'])
输出:
c d e
a b
0.439502 0.115087 0.832546 0.760513 0.776555
0.609107 0.247642 0.031650 0.727773
0.995370 0.299640 0.053523 0.565753 0.857235
0.392132 0.832560 0.774653 0.213692
每个数据系列按索引 ID a
分组,b
表示 a
的其他特征的时间索引。有没有办法让 Pandas 产生一个反射(reflect) a
分组的 numpy 3d 数组?目前它读取二维数据,因此 pdf.shape
输出 (4, 5)
。我希望数组具有可变形式:
array([[[-1.38655912, -0.90145951, -0.95106951, 0.76570984],
[-0.21004144, -2.66498267, -0.29255182, 1.43411576],
[-0.21004144, -2.66498267, -0.29255182, 1.43411576]],
[[ 0.0768149 , -0.7566995 , -2.57770951, 0.70834656],
[-0.99097395, -0.81592084, -1.21075386, 0.12361382]]])
是否有原生的 Pandas 方法可以做到这一点?请注意,实际数据中每个 a
分组的行数是可变的,因此我不能只是转置或 reshape pdf.values
。如果没有原生方法,那么从数十万行和数百列迭代构建数组的最佳方法是什么?
最佳答案
我刚刚遇到了一个非常相似的问题,并且是这样解决的:
a3d = np.array(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix)))
输出:
array([[[ 0.47780308, 0.93422319, 0.00526572, 0.41645868, 0.82089215],
[ 0.47780308, 0.15372096, 0.20948369, 0.76354447, 0.27743855]],
[[ 0.75146799, 0.39133973, 0.25182206, 0.78088926, 0.30276705],
[ 0.75146799, 0.42182369, 0.01166461, 0.00936464, 0.53208731]]])
验证它是 3d,a3d.shape 给出 (2, 2, 5)。
最后,要使新创建的维度成为最后一个维度(而不是第一个维度),请使用:
a3d = np.dstack(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix)))
其形状为 (2, 5, 2)
对于数据参差不齐的情况(如 CharlesG 在评论中提出的那样),如果您想坚持使用 numpy 解决方案,则可以使用类似的内容。但请注意,处理缺失数据的最佳策略因情况而异。在这个例子中,我们只是为缺失的行添加零。
参差不齐的示例设置:
pdf = pd.DataFrame(np.random.rand(5,5), columns = list('abcde'))
pdf['a'][2:]=pdf['a'][0]
pdf['a'][:2]=pdf['a'][1]
pdf.set_index(['a','b'])
数据框:
c d e
a b
0.460013 0.577535 0.299304 0.617103 0.378887
0.167907 0.244972 0.615077 0.311497
0.318823 0.640575 0.768187 0.652760 0.822311
0.424744 0.958405 0.659617 0.998765
0.077048 0.407182 0.758903 0.273737
一种可能的解决方案:
n_max = pdf.groupby('a').size().max()
a3d = np.array(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix)
.apply(lambda x: np.pad(x, ((0, n_max-len(x)), (0, 0)), 'constant'))))
a3d.shape 给出 (2, 3, 5)
关于python - Pandas Dataframe 或 Panel 到 3d numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478297/