问题 构建3D Pandas DataFrame


我在Pandas中构建3D DataFrame时遇到了困难。我想要这样的东西

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

哪里 AB等等是顶级描述符和 start 和 end 是次要描述。随后的数字是成对的,并且没有相同数量的对 AB 等等 A 有四个这样的对, B 只有1,和 C 有3个。

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

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

并且所需的输出是顶部的输出。它代表某个序列中子序列的起点和终点(ABC 是不同的序列)。根据序列本身,有不同数量的子序列满足我正在寻找的给定条件。因此,有不同数量的start:end对 AB等等


6617
2018-06-18 16:17


起源



答案:


首先,我认为您需要填写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

9
2018-06-18 16:31



我的数据被组织为一个列表列表 C=[[...],[...],[...]...] 因为每个嵌套列表具有不同的长度。我怎么能处理这种情况? - tlnagy
这个实现给我一个错误,因为嵌套列表的长度 C 不等于长度 A 和 B - tlnagy
每个列表代表什么,行或列?它们为什么长度不同?较短的列表是否应该缺少某些元素?请参阅已编辑的答案进行猜测。 - chrisb
每个嵌套列表中的值都是行,嵌套列表本身就是列。列的长度不同,因为 one 具有不同数量的start:end对 two - tlnagy
我认为我们对术语感到纠结 - 你能编辑你的问题以提供一些与你所说的相匹配的数据,然后显示你想要的输出吗? - chrisb


答案:


首先,我认为您需要填写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

9
2018-06-18 16:31



我的数据被组织为一个列表列表 C=[[...],[...],[...]...] 因为每个嵌套列表具有不同的长度。我怎么能处理这种情况? - tlnagy
这个实现给我一个错误,因为嵌套列表的长度 C 不等于长度 A 和 B - tlnagy
每个列表代表什么,行或列?它们为什么长度不同?较短的列表是否应该缺少某些元素?请参阅已编辑的答案进行猜测。 - chrisb
每个嵌套列表中的值都是行,嵌套列表本身就是列。列的长度不同,因为 one 具有不同数量的start:end对 two - tlnagy
我认为我们对术语感到纠结 - 你能编辑你的问题以提供一些与你所说的相匹配的数据,然后显示你想要的输出吗? - chrisb


你不能只使用面板吗?

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

3
2018-06-18 16:31



我的数据集很可能在未来具有更高的维度。面板是否仅限于3个尺寸? - tlnagy
注意:面板现在是 弃用! - Aaron N. Brock