下面是一个测试示例,展示我正在努力实现的目标。这是一个玩具数据框:
df = pd.DataFrame(np.random.randn(10,7),index=range(1,11),columns=headers)
它给予
Time A_x A_y A_z B_x B_y B_z
1 -0.075509 -0.123527 -0.547239 -0.453707 -0.969796 0.248761 1.369613
2 -0.206369 -0.112098 -1.122609 0.218538 -0.878985 0.566872 -1.048862
3 -0.194552 0.818276 -1.563931 0.097377 1.641384 -0.766217 -1.482096
4 0.502731 0.766515 -0.650482 -0.087203 -0.089075 0.443969 0.354747
5 1.411380 -2.419204 -0.882383 0.005204 -0.204358 -0.999242 -0.395236
6 1.036695 1.115630 0.081825 -1.038442 0.515798 -0.060016 2.669702
7 0.392943 0.226386 0.039879 0.732611 -0.073447 1.164285 1.034357
8 -1.253264 0.389148 0.158289 0.440282 -1.195860 0.872064 0.906377
9 -0.133580 -0.308314 -0.839347 -0.517989 0.652120 0.477232 -0.391767
10 0.623841 0.473552 0.059428 0.726088 -0.593291 -3.186297 -0.846863
我要做的只是计算每个头(A和B)的向量长度,在本例中,为每个索引,除以Time
列。因此,这个函数必须是np.sqrt(A_x^2 + A_y^2 + A_z^2)
,当然对于B也是一样的。一、 我想计算每一行的速度,但是有三个列会产生一个速度结果。
我试过使用df.groupby
和df.filter
循环遍历列,但我无法真正让它工作,因为我根本不确定如何将相同的函数有效地应用于数据帧的块,一次完成(很明显,一个是避免循环遍历行)。我试过了
df = df.apply(lambda x: np.sqrt(x.dot(x)), axis=1)
当然,这是可行的,但前提是输入数据框的列数(3)正确,如果更长,那么点积是在整行上计算的,而不是在我想要的三列的块中计算(因为这是与标记坐标相对应的,标记坐标是三维的)。
所以这就是我在上面的例子中最终想要得到的结果(下面的数组只是填充了随机数,而不是我试图计算的实际速度-只是为了显示我想要达到的形状):
Velocity_A Velocity_B
1 -0.975633 -2.669544
2 0.766405 -0.264904
3 0.425481 -0.429894
4 -0.437316 0.954006
5 1.073352 -1.475964
6 -0.647534 0.937035
7 0.082517 0.438112
8 -0.387111 -1.417930
9 -0.111011 1.068530
10 0.451979 -0.053333
我的实际数据是50000 x 36(因此有12个x,y,z坐标标记),我想一次性计算速度,以避免迭代(如果可能的话)。还有一个相同长度的时间列(50000x1)。
你怎么做到的?
谢谢,阿斯特里德
我至少会在标记标识符上做一个循环,但不用担心,这是一个非常快速的循环,它只确定筛选模式以获得正确的列:
你的计算比熊猫式的更简洁,我的意思是,如果你把你的数据帧仅仅看作一个大数组,那么计算就可以简洁地表达出来,而当你试图把数据帧和熔化、分组等纠缠在一起时,解决方案(至少是我提出的解决方案)就更复杂了
整个计算基本上可以用一行来表示:
所以这是一种新的方式:
会产生
因为您的实际数据帧具有形状(50000,36),所以选择快速方法可能很重要。以下是一个基准:
使用IPython:
一个可能的开始。
筛选出与特定向量对应的列名。例如
从数据框中选择这些列
因此,使用这种技术可以得到3列的数据块。例如。
我得到的答案和你的不一样。但是,我借用了你的
df.apply(lambda x: np.sqrt(x.dot(x)), axis=1)
并假设它是正确的。希望这有帮助。
相关问题 更多 >
编程相关推荐