首页 > 解决方案 > 如何将 ndarray 转换为“高”的 Pandas DataFrame

问题描述

我正在做的一些工作会产生不同维度的输出张量(numpy ndarray),具体取决于我感兴趣/想要随时间绘制的内容,有时我可能会选择年龄组和性别作为我的目标,这将产生 3D我们拥有的张量

age_groups[
  genders[
    days[Value, ..., Value], 
    days[Value, ..., Value]
  ],
  ...,
  genders[
    days[Value, ..., Value]
    days[Value, ..., Value]
  ],
]

我的问题是,我怎样才能最有效地将其转换为如下所示的数据框:

     Age_Group  Gender  Day  Value
0    1          M       1    blah
1    1          F       1    blah
2    1          M       2    blah
4    1          F       2    blah
5    1          M       3    blah
6    1          F       3    blah
7    1          M       4    blah
...
n    5          F       21   blah

如果我添加另一个目标来分组,我如何确保它可以推广到,比如头发颜色,以便将另一列添加到生成的 df 中?

对不起,如果这个问题有点抽象,我希望我能清楚地说明我的问题,如果不是,我可以尝试进一步澄清。

标签: pythonpandasnumpy

解决方案


您可以从阵列的扁平版本创建 MultiIndex 数据框。在 3D 数组的每个索引处,变量的值是什么并没有真正的指示,但假设是任意顺序:

arr = np.arange(4*2*21).reshape(4, 2, 21)  # example array
ix = pd.MultiIndex.from_product(
    [[1, 2, 3, 4], ['M', 'F'], np.arange(1, 22)],
    names=['Age_Group', 'Gender', 'Day']
)
df = pd.DataFrame(arr.flatten(), index=ix, columns=['Value'])

输出:

     Age_Group Gender  Day  Value
0            1      M    1      0
1            1      M    2      1
2            1      M    3      2
3            1      M    4      3
4            1      M    5      4
..         ...    ...  ...    ...
163          4      F   17    163
164          4      F   18    164
165          4      F   19    165
166          4      F   20    166
167          4      F   21    167

如果每个索引处变量值的顺序不同,只需更改函数的输入from_product以匹配您的数组。


推荐阅读