如果我的数据框显示为:
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个小时。如果这是最好的方法,那么我将处理等待,但是我很想知道是否有人可以提出更快的方法。
答案 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数组