Python 如何将按x、y、z坐标排序的数据帧转换为numpy数组列表?

Python 如何将按x、y、z坐标排序的数据帧转换为numpy数组列表?,python,pandas,dataframe,Python,Pandas,Dataframe,如果我有一个数据框,如下所示: x y z t1 t2 t3 t4 t5 ... c1 1 2 3 15 98 36 45 24 c2 2 ... c3 3 ... c4 4 ... c5 5 ... c6 6 ... . . . 其中,基本上每一行都是不同的坐标,每一列都是时间序列中的一个点,每个条目(c_i,t_j)都是某种度量。我想做的是把它放到一种4D张量中(我希望这是正确的术语),其中的维度是(x,y,z,t),所以每个条目都是一个3D numpy数组,每个条目

如果我有一个数据框,如下所示:

    x y z t1 t2 t3 t4 t5 ...
c1  1 2 3 15 98 36 45 24
c2  2 ...
c3  3 ...
c4  4 ... 
c5  5 ...
c6  6 ...
.
.
.
其中,基本上每一行都是不同的坐标,每一列都是时间序列中的一个点,每个条目(c_i,t_j)都是某种度量。我想做的是把它放到一种4D张量中(我希望这是正确的术语),其中的维度是(x,y,z,t),所以每个条目都是一个3D numpy数组,每个条目都是相应的(c,t)度量

以下是我目前拥有的:

tensor = []    

for i in range(len(list(df.columns)) - 3):
    tensor.append(np.zeros((max_x - min_x + 1, max_y - min_y + 1, max_z - min_z + 1)))
    for j in range(len(df["x"])):
        tensor[i][df["x"][j] - min_x][df["y"][j] - min_y][df["z"][j] - min_z] = df.iloc[:, i + 3][j]

然后我可以简单地将张量转换成所需的必要对象。目前,我的数据集是93164x13455,所以我估计这需要大约32个小时。如果这是最好的方法,那么我将处理等待,但我想知道是否有人能想出一个更快的方法。

如果我正确理解了你,而不是像这样:

x1 y1 z1 t1 t2 t3
你想要这样的吗

x1 y1 z1 t1

x1 y1 z1 t2

x1 y1 z1 t3
我认为有不止一种方法可以做到这一点,但这里有一种方法使用Pandas中的melt功能。假设您有一个数据帧(如下所示),您需要将t2中的变量移动到t1,或者换一种说法,您需要合并t1和t2

df = pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], columns=['x','y','t1','t2'])

    x   y  t1  t2
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12
3  13  14  15  16
4  17  18  19  20
要做我相信你说过你想做的事,你可以做以下事情

f_df = df.melt(id_vars=['x','y'], value_vars = ['t1','t2'], value_name='t').drop('variable', axis=1).sort_values('x')
现在使用f_df:

    x   y   t
0   1   2   3
5   1   2   4
1   5   6   7
6   5   6   8
2   9  10  11
7   9  10  12
3  13  14  15
8  13  14  16
4  17  18  19
9  17  18  20

从这里,您可以简单地将其转换为numpy数组

Yes!这太完美了。非常感谢你。