我有一个 Pandas 数据框,如下所示:
p1 p2 p3
t1 a b c
t2 d e f
t3 g h i
我想要几个 df (或一个 xarray),每个 t(y 轴)一个 像:
对于 t1:pn 减去 t1 的 pn 的值:
p1 p2 p3
p1 a-a b-a c-a
p2 a-b b-b c-b
p3 a-c b-c c-c
t2、t3 等同上...
我做了一个循环
for t in tlist :
for p in plist :
for q in plist :
res = p - q
但是它很大而且很慢。
因此,如果有人知道Python式的方法来做到这一点,我们非常欢迎!
最佳答案
这可以利用 numpy 的 broadcasting 以非常简单的方式完成。 。让我们尝试使用以下 ndarray:
a = np.random.randint(1,10,(3,3))
print(a)
array([[9, 6, 4],
[2, 3, 6],
[8, 9, 2]])
a[:,None] - a[...,None]
array([[[ 0, -3, -5],
[ 3, 0, -2],
[ 5, 2, 0]],
[[ 0, 1, 4],
[-1, 0, 3],
[-4, -3, 0]],
[[ 0, 1, -6],
[-1, 0, -7],
[ 6, 7, 0]]])
这是通过向数组添加新轴来实现的,减去它们会产生所需的笛卡尔运算,因为:
print(a[:,None])
array([[[9, 6, 4]],
[[2, 3, 6]],
[[8, 9, 2]]])
print(a[...,None])
array([[[9],
[6],
[4]],
[[2],
[3],
[6]],
[[8],
[9],
[2]]])
关于python - Pandas : transform a 2D dataframe to a 3D one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526752/