将三维数组重塑为二维数组以生成DataFrame:跟踪索引以生成列名



以下代码从第一个轴上的3D阵列生成pandas.DataFrame。我手动创建列名(定义cols(:有没有更内置的方法可以做到这一点(以避免潜在的错误,例如关于C顺序(?

-->我正在寻找一种方法来保证在reshape操作之后索引的顺序的尊重(这里它依赖于range(nrow)range(ncol)上迭代的正确顺序(。

import numpy as np
import pandas as pd
nt = 6 ; nrow = 4 ; ncol = 3 ; shp = (nt, nrow, ncol)
np.random.seed(0)
a = np.array(np.random.randint(0, 1000, nt*nrow*ncol)).reshape(shp)
# This is the line I think should be improved --> any numpy function or so?
cols = [str(i) + '-' + str(j) for i in range(nrow) for j in range(ncol)]
adf = pd.DataFrame(a.reshape(nt, -1), columns = cols)
print(adf)
0-0  0-1  0-2  1-0  1-1  1-2  2-0  2-1  2-2  3-0  3-1  3-2
0  684  559  629  192  835  763  707  359    9  723  277  754
1  804  599   70  472  600  396  314  705  486  551   87  174
2  600  849  677  537  845   72  777  916  115  976  755  709
3  847  431  448  850   99  984  177  755  797  659  147  910
4  423  288  961  265  697  639  544  543  714  244  151  675
5  510  459  882  183   28  802  128  128  932   53  901  550

编辑

说明我为什么不喜欢我的解决方案——制作一个技术上有效但产生错误结果的代码太容易了(反转ijnrowncol(:

wrongcols1 = [str(i) + '-' + str(j) for i in range(ncol) for j in range(nrow)]
adf2 = pd.DataFrame(a.reshape(nt, -1), columns=wrongcols1)
print(adf2)
0-0  0-1  0-2  0-3  1-0  1-1  1-2  1-3  2-0  2-1  2-2  2-3
0  684  559  629  192  835  763  707  359    9  723  277  754
1  804  599   70  472  600  396  314  705  486  551   87  174
2  600  849  677  537  845   72  777  916  115  976  755  709
3  847  431  448  850   99  984  177  755  797  659  147  910
4  423  288  961  265  697  639  544  543  714  244  151  675
5  510  459  882  183   28  802  128  128  932   53  901  550
wrongcols2 = [str(j) + '-' + str(i) for i in range(nrow) for j in range(ncol)]
adf3 = pd.DataFrame(a.reshape(nt, -1), columns=wrongcols2)
print(adf3)
0-0  1-0  2-0  0-1  1-1  2-1  0-2  1-2  2-2  0-3  1-3  2-3
0  684  559  629  192  835  763  707  359    9  723  277  754
1  804  599   70  472  600  396  314  705  486  551   87  174
2  600  849  677  537  845   72  777  916  115  976  755  709
3  847  431  448  850   99  984  177  755  797  659  147  910
4  423  288  961  265  697  639  544  543  714  244  151  675
5  510  459  882  183   28  802  128  128  932   53  901  550

试试这个,看看它是否适合您的用例:

通过np.indices、np.dstack和np.vstack:的组合生成列

columns = np.vstack(np.dstack(np.indices((nrow, ncol))))
array([[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2],
[3, 0],
[3, 1],
[3, 2]])

现在通过映射、联接和列表理解的组合转换为字符串:

columns = ["-".join(map(str, entry)) for entry in columns]
['0-0',
'0-1',
'0-2',
'1-0',
'1-1',
'1-2',
'2-0',
'2-1',
'2-2',
'3-0',
'3-1',
'3-2']

让我们知道进展如何。

您可以尝试使用pd.MultiIndex来构建层次结构。

首先将您的cols重新定义为tuples:的list

cols = [(i, j) for i in range(nrow) for j in range(ncol)]

然后用cols:构造多索引

multi_cols = pd.MultiIndex.from_tuples(cols)

并构建数据帧:

adf = pd.DataFrame(a.reshape(nt, -1), columns=multi_cols)

结果:

0           1           2           3
0   1   2   0   1   2   0   1   2   0   1   2
0   684 559 629 192 835 763 707 359   9 723 277 754
1   804 599  70 472 600 396 314 705 486 551  87 174
2   600 849 677 537 845  72 777 916 115 976 755 709
3   847 431 448 850  99 984 177 755 797 659 147 910
4   423 288 961 265 697 639 544 543 714 244 151 675
5   510 459 882 183  28 802 128 128 932  53 901 550

元素访问:

print(adf[1][2][0])
>>> 763

最新更新