numpy 将PandasDataFrame转换为数据立方体?

rbl8hiat  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一个包含四列的DataFrame:X、Y、Z和t。前三列中的值是离散的,表示三维索引。第四列是浮点数。例如,

df = pd.DataFrame({'X':[1,2,3,2,3,1],
                   'Y':[1,1,2,2,3,3],
                   'Z':[1,2,1,2,1,2],
                   't':np.random.rand(6)})
#   X  Y  Z         t
#0  1  1  1  0.410462
#1  2  1  2  0.385973
#2  3  2  1  0.434947
#3  2  2  2  0.880702
#4  3  3  1  0.297190
#5  1  3  2  0.750949

如何有效地将df扩展到3D数据立方体中?(本例中有18个顶点。)新行中t的值应为np.nan。换句话说,我希望添加所有“缺少”的行,例如:

...
#6  1  1  2  nan
#7  1  1  3  nan
#8  1  2  1  nan
...

X、Y和Z的范围很大,但并不是很大(例如,10、200和1000个唯一值)。

w3nuxt5m

w3nuxt5m1#

这里有一种方法可以使用Python标准库的itertool模块中的product来实现:

from itertools import product

import pandas as pd

axis = ["X", "Y", "Z"]

df = (
    pd.concat(
        [
            df,
            pd.DataFrame(
                product(df["X"].unique(), repeat=df["X"].nunique()),
                columns=axis,
            ),
        ]
    )
    .drop_duplicates(subset=axis, keep="first")
    .sort_values(axis, ignore_index=True)
)

然后道:

print(df)
# Output
    X  Y  Z         t
0   1  1  1  0.994531
1   1  1  2       NaN
2   1  1  3       NaN
3   1  2  1       NaN
4   1  2  2       NaN
5   1  2  3       NaN
6   1  3  1       NaN
7   1  3  2  0.937584
8   1  3  3       NaN
9   2  1  1       NaN
10  2  1  2  0.168245
11  2  1  3       NaN
12  2  2  1       NaN
13  2  2  2  0.362854
14  2  2  3       NaN
15  2  3  1       NaN
16  2  3  2       NaN
17  2  3  3       NaN
18  3  1  1       NaN
19  3  1  2       NaN
20  3  1  3       NaN
21  3  2  1  0.634389
22  3  2  2       NaN
23  3  2  3       NaN
24  3  3  1  0.953114
25  3  3  2       NaN
26  3  3  3       NaN

相关问题