Python 构建三维数据帧
我在熊猫中构建3D数据帧时遇到困难。我想要这样的东西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
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
的开始:结束对的数量不同,我认为我们在术语上有点纠结-你能编辑你的问题,提供一些与你所说内容相匹配的数据,然后显示你想要的输出吗?