我有一个熊猫数据框,如:
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的方法,[s]他将非常欢迎!
答案 0 :(得分:2)
这可以通过广播来完成:
df = pd.DataFrame([[0,1,2],[3,6,8]])
# update as commented by piRSquared
a = df.to_numpy() # use a=df.values if on Pandas < 0.24
a = (a[:, None, :] - a[:,:,None]).reshape(-1, df.shape[1])
idx = pd.MultiIndex.from_product((df.index,df.columns), names=('t','p'))
pd.DataFrame(a, index=idx, columns=df.columns)
输出:
0 1 2
t p
0 0 0 1 2
1 -1 0 1
2 -2 -1 0
1 0 0 3 5
1 -3 0 2
2 -5 -2 0
答案 1 :(得分:2)
可以使用numpy的https://github.com/mattlewis92/angular-calendar以非常简单的方式完成此操作。让我们尝试以下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]]])