python - Pandas Dataframe 或 Panel 到 3d numpy 数组

标签 python numpy pandas

设置:

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/

相关文章:

python - 通过替换对 2D numpy 数组中的行进行采样

python - 使用 kwargs 执行 Pool.map() 时出现 "TypeError: foo() takes exactly 1 argument"

python - “property”对象不能被解释为整数

python - 获取数组某部分的平均值

python - Pandas 系列 - 仅当指数月份位于 [1,2,3] 时才保留值(value)

python-3.x - 带标签的 Python Dataframe 单行

python - Python 中的函数“子类化”?

python - 根据可能出现多次的关键词拆分列表

python - 写入yaml文件: attribute error

python - 来自列表/字典/列表的 Pandas DataFrame