Pandas :将 2D 数据框转换为 3D 数据框
Pandas : transform a 2D dataframe to a 3D one
我有一个 Pandas 数据框,例如:
p1 p2 p3
t1 a b c
t2 d e f
t3 g h i
我想要几个 df(或一个 xarray),每个 t(y 轴)一个
喜欢:
对于 t1:t1 的 pn 减去 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
但它又大又慢。
因此,如果有人知道用 pythonic 方式做到这一点,[s]他非常欢迎!
这可以通过广播来完成:
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)
输出:
0 1 2
t p
0 0 0 1 2
1 -1 0 1
2 -2 -1 0
1 0 0 3 5
1 -3 0 2
2 -5 -2 0
这可以利用 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]]])
我有一个 Pandas 数据框,例如:
p1 p2 p3
t1 a b c
t2 d e f
t3 g h i
我想要几个 df(或一个 xarray),每个 t(y 轴)一个 喜欢:
对于 t1:t1 的 pn 减去 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
但它又大又慢。
因此,如果有人知道用 pythonic 方式做到这一点,[s]他非常欢迎!
这可以通过广播来完成:
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)
输出:
0 1 2
t p
0 0 0 1 2
1 -1 0 1
2 -2 -1 0
1 0 0 3 5
1 -3 0 2
2 -5 -2 0
这可以利用 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]]])