Python 熊猫:将二维数据帧转换为三维数据帧

Python 熊猫:将二维数据帧转换为三维数据帧,python,pandas,python-xarray,Python,Pandas,Python Xarray,我有一个数据框,如: 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等的idem 我做了一个像这样的循环 for t in tlist : for p in pl

我有一个数据框,如:

     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等的idem

我做了一个像这样的循环

for t in tlist :
    for p in plist :
        for q in plist :
            res = p - q
但是它又大又慢


所以,如果有人知道一种蟒蛇式的方法,他是非常受欢迎的

这可以通过广播实现:

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)

这可以用一种非常简单的方式利用numpy的。让我们尝试以下方法:

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]]])

使用
来计算数值
而不是
。将结果分配给中间结果,以避免将
运行到\u numpy
两次。(
a=df.to_numpy();a=(a[:,None,:]-a[:,:,None])。重塑(-1,df.shape[1])
。回答棒极了(:谢谢,更新了。虽然我不知道为什么文档建议
to_numpy()
而不是
。值
。对我来说,它更长,更难键入:-)对我来说也是如此。@piRSquared quared@quanthong
to_numpy
vs
。值
是。快速阅读后,它确实清楚了为什么要将
.to_numpy()
作为一种方法(具有参数选项,例如
dtype=
),而不是普通属性
。值
。它对我有用,我不知道广播……非常感谢!
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]]])