如何将按x,y,z坐标排序的熊猫数据框转换为numpy数组列表?

时间:2018-07-18 20:08:30

标签: 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 ndarray,每个术语作为相应的(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]

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

1 个答案:

答案 0 :(得分:1)

所以,如果我正确地理解了您,而不是像这样:

x1 y1 z1 t1 t2 t3

您想要这样的东西吗?

x1 y1 z1 t1

x1 y1 z1 t2

x1 y1 z1 t3

我认为有多种方法可以做到这一点,但这是在Pandas中使用融合功能的一种方法。假设您有一个数据框(如下面的数据框),并且需要将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数组