我有一个test_matrix
:
A B C
A nan 10 20
B 30 nan 40
C 50 60 nan
我的数据帧应该是:
cus1 cus2 lower upper
A B 30 10
A C 50 20
B C 60 40
我可以用两部分提取上面的数据帧(我首先提取上面的三角形,然后提取下面的三角形):
lower_triangular = test_matrix[np.tril_indices(test_matrix.shape[0], -1)]
upper_triangular = test_matrix[np.triu_indices(test_matrix.shape[0], 1)]
但是当我创建一个数据帧时,我有一堆代码,要提取上面正确的数据帧非常复杂
我能提取一次吗
更新解决方案
Mr/Ms-Pygirl给出了一个很好的解决方案,但是当您的矩阵具有值0
时:
A B C
A nan 10 0
B 30 nan 40
C 0 60 nan
Pygirl解决方案将给出一个结果:
cus1 cus2 lower upper
A B 30 10
B C 60 40
如果要获取值0
(索引:AC
和CA
),应使用:
df2=df.where(np.triu(np.ones(df.shape)).astype(np.bool)).stack().rename_axis(('cus1', 'cus2')).reset_index(name='upper')
y=df.where(np.tril(np.ones(df.shape)).astype(np.bool)).stack().values
结果是:
cus1 cus2 lower upper
A B 30 10
A C 0 0
B C 60 40
问题2(使用PYGIRL-SOLUTION后)
我有一个具有4x4维度的test_matrix
:
A B C D
A nan 10 20 30
B 40 nan 50 60
C 70 80 nan 90
D 100 110 120 nan
我的数据帧应该是:
cus1 cus2 lower upper
A B 40 10
A C 70 20
A D 100 30
B C 80 50
B D 110 60
D C 120 90
但是我得到了一个错误的结果(失去了DC和错误的AD,BC):
cus1 cus2 lower upper
A B 40 10
A C 70 20
A D *80* *30*
B C *100* *50*
B D 110 60
代码设置:
输出:
尝试:
df2:
编辑:
df3:
相关问题 更多 >
编程相关推荐