pandas 如何将多维对称 Dataframe 转换为2列 Dataframe 而不重复?

2g32fytz  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(141)

这是我的数据。我想把这个多维对称 Dataframe 转换成一个2列的 Dataframe ,而不需要重复。

#coding=utf-8
import pandas as pd
import numpy as np
#########

cor = [('E1',0,0,0.8,-0.8),
         ('E2',0,0,1.0,1.0),
         ('E3',0.8,1.0,0,1.0),
         ('E4',-0.8,1.0,1.0,0)]
label = ['','E1','E2', 'E3', 'E4']
R = pd.DataFrame.from_records(cor, columns=label)
print(R)

**我想将其转换为2列矩阵,但不重复。**我想要的主要结果如下:

snz8szmq

snz8szmq1#

使用DataFrame.stack进行整形(首先将空字符串列转换为index),通过DataFrame.rename_axis设置新索引名,并通过Mapfrozenset删除MultiIndex中的重复项:

R = R.set_index('').stack().rename_axis(['x','y'])

R = R[~R.index.map(frozenset).duplicated()].reset_index(name='cor')
print(R)
    x   y  cor
0  E1  E1  0.0
1  E1  E2  0.0
2  E1  E3  0.8
3  E1  E4 -0.8
4  E2  E2  0.0
5  E2  E3  1.0
6  E2  E4  1.0
7  E3  E3  0.0
8  E3  E4  1.0
9  E4  E4  0.0

或者使用numpy.triu将下三角形值转换为DataFrame.where中的缺失值,因此stack删除缺失值:

R = R.set_index('')

print(R.where(np.triu(np.ones(R.shape, dtype=bool))))
     E1   E2   E3   E4
                      
E1  0.0  0.0  0.8 -0.8
E2  NaN  0.0  1.0  1.0
E3  NaN  NaN  0.0  1.0
E4  NaN  NaN  NaN  0.0

R = (R.where(np.triu(np.ones(R.shape, dtype=bool)))
      .stack()
      .rename_axis(['x','y'])
      .reset_index(name='cor'))

print(R)
    x   y  cor
0  E1  E1  0.0
1  E1  E2  0.0
2  E1  E3  0.8
3  E1  E4 -0.8
4  E2  E2  0.0
5  E2  E3  1.0
6  E2  E4  1.0
7  E3  E3  0.0
8  E3  E4  1.0
9  E4  E4  0.0

相关问题