Python 构建三维数据帧

Python 构建三维数据帧,python,pandas,Python,Pandas,我在熊猫中构建3D数据帧时遇到困难。我想要这样的东西 A B C start end start end start end ... 7 20 42 52 90 101 11 21 213 34 56 74 9 45 45

我在熊猫中构建3D数据帧时遇到困难。我想要这样的东西

A               B               C
start    end    start    end    start    end ...
7        20     42       52     90       101
11       21                     213      34
56       74                     9        45
45       12
其中,
A
B
等是顶级描述符,
start
end
是子描述符。下面的数字是成对的,
A
B
等的成对数不同。请注意,
A
有四对这样的成对,
B
只有1对,而
C
有3对

我不知道如何继续构建这个数据帧。修改示例没有给我设计的输出:

import numpy as np
import pandas as pd

A = np.array(['one', 'one', 'two', 'two', 'three', 'three'])
B = np.array(['start', 'end']*3)
C = [np.random.randint(10, 99, 6)]*6
df = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C'])
df.set_index(['A', 'B'], inplace=True)
df
产生:

                C
 A          B   
 one        start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]
 two        start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]
 three      start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]
有没有办法将C中的列表拆分为各自的列

编辑:我的
C
的结构很重要。如下所示:

 C = [[7,11,56,45], [20,21,74,12], [42], [52], [90,213,9], [101, 34, 45]]

所需的输出是顶部的输出。它表示特定序列中子序列的起点和终点(
a
B
C
是不同的序列)。根据序列本身的不同,满足给定条件的子序列数量也不同。因此,
a
B
等的开始对和结束对的数量不同。首先,我认为需要填充C来表示缺少的值

In [341]: max_len = max(len(sublist) for sublist in C)
In [344]: for sublist in C:
     ...:     sublist.extend([np.nan] * (max_len - len(sublist)))

In [345]: C
Out[345]: 
[[7, 11, 56, 45],
 [20, 21, 74, 12],
 [42, nan, nan, nan],
 [52, nan, nan, nan],
 [90, 213, 9, nan],
 [101, 34, 45, nan]]
然后,将其转换为numpy数组,进行转置,并与列一起传递给DataFrame构造函数

In [288]: C = np.array(C)
In [289]: df = pd.DataFrame(data=C.T, columns=pd.MultiIndex.from_tuples(zip(A,B)))

In [349]: df
Out[349]: 
     one         two       three     
   start  end  start  end  start  end
0      7   20     42   52     90  101
1     11   21    NaN  NaN    213   34
2     56   74    NaN  NaN      9   45
3     45   12    NaN  NaN    NaN  NaN

你不能只用一个面板吗

import numpy as np
import pandas as pd

A = ['one', 'two' ,'three']
B = ['start','end']
C = [np.random.randint(10, 99, 2)]*6
df = pd.DataFrame(C,columns=B  )
p={}
for a in A:
    p[a]=df
panel= pd.Panel(p)
print panel['one']

正如@Aaron在上面的评论中提到的,面板已经被弃用。此外,@tlnagy还提到,他的数据集将来可能会扩展到3个以上的维度

这听起来像是这个包的一个很好的用例,它提供了任意多维度的语义标记数组。Pandas和xarray具有强大的转换支持,而且面板已被弃用以支持使用xarray

问题的初始设置

import numpy as np

A = np.array([[7,11,56,45], [20,21,74,12]]).T
B = np.array([[42], [52]]).T
C = np.array([[90,213,9], [101, 34, 45]]).T
然后可以创建三维xarray.DataArray对象,如下所示:

import xarray

output_as_dataarray = xarray.concat(
    [
        xarray.DataArray(
            X,
            dims=["record", "edge"],
            coords={"record": range(X.shape[0]), "edge": ["start", "end"]},
        )
        for X in (A, B, C)
    ],
    dim="descriptor",
).assign_coords(descriptor=["A", "B", "C"])
我们将三个2D numpy数组转换为xarray.DataArray对象,然后沿新维度将它们连接在一起

我们的输出如下所示:

<xarray.DataArray (descriptor: 3, record: 4, edge: 2)>
array([[[  7.,  20.],
        [ 11.,  21.],
        [ 56.,  74.],
        [ 45.,  12.]],

       [[ 42.,  52.],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan]],

       [[ 90., 101.],
        [213.,  34.],
        [  9.,  45.],
        [ nan,  nan]]])
Coordinates:
  * record      (record) int64 0 1 2 3
  * edge        (edge) <U5 'start' 'end'
  * descriptor  (descriptor) <U1 'A' 'B' 'C'

数组([[7,20.],
[ 11.,  21.],
[ 56.,  74.],
[ 45.,  12.]],
[[ 42.,  52.],
[楠,楠],,
[楠,楠],,
[nan,nan]],
[[ 90., 101.],
[213.,  34.],
[  9.,  45.],
[楠,楠]]]
协调:
*记录(记录)int64 01 2 3

*edge(edge)我的数据集在未来可能会更高维。面板不限于3维吗?注意:面板现在是!更新的弃用参考:我的数据被组织为一个列表列表,以便
C=[…]、[…]、[…]、[…]、[…]…]
,因为每个嵌套列表的长度不同。我该如何处理这种情况?这个实现给了我一个错误,因为
C
中嵌套列表的长度不等于
A
B
的长度,每个列表表示什么,行还是列?为什么它们的长度不同?较短的列表是否应该缺少某些元素?有关猜测,请参阅编辑后的答案。每个嵌套列表中的值都是行,而嵌套列表本身就是列。列的长度不同,因为
one
two
的开始:结束对的数量不同,我认为我们在术语上有点纠结-你能编辑你的问题,提供一些与你所说内容相匹配的数据,然后显示你想要的输出吗?