python - Pandas : transform a 2D dataframe to a 3D one

标签 python pandas python-xarray

我有一个 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/

相关文章:

python - 读取制表符分隔的文件,第一列作为键,其余列作为值

python xarray 按纬度/经度选择并将点数据提取到数据帧

python - 使用 `xarray.Dataset.to_zarr` 函数打印上传进度

python - 相反的比较和替换

python - 使用 Peewee 处理数据库断开连接

python - 填写 groupby 的缺失日期

python - DataFrame 运行计数和连接

python pyscopg2无法从AWS redshift选择数据

python - Vim Omnicompletion 的运行时错误

python - 来自 Pandas.DataFrames 列表的 Xarray.DataSet