将正方形数据帧转换为高形式

2024-04-24 09:31:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,它是一个相关矩阵。我想用它创建一个图,为此我需要转换如下所示的相关数据帧

df = pd.DataFrame([[1,0.2,0.4],[0.2,1,0.6],[0.4,0.6,1]])
df.columns = list('ABC')
df.index= list('ABC')
df

# result- 

     A    B    C
A  1.0  0.2  0.4
B  0.2  1.0  0.6
C  0.4  0.6  1.0

此格式-

df = pd.DataFrame({ 'from':['A', 'A', 'A', 'B', 'B', 'C'], 'to':['A', 'B', 'C', 'B', 'C', 'C'], 'value':[1, 0.2,0.4,1,0.6,1]})
df

# result- 
  from to  value
0    A  A    1.0
1    A  B    0.2
2    A  C    0.4
3    B  B    1.0
4    B  C    0.6
5    C  C    1.0

我如何做到这一点?你知道吗


Tags: columnsto数据fromdataframedfindexvalue
2条回答

我接受了耶斯列的回答。为了完整起见,我添加了几行来删除重复项。你知道吗

# from jezrael's solution
df1 = df.stack().rename_axis(('from','to')).reset_index(name='value')

# drop the dupes
df1.loc[:, ['from', 'to']] = df1.loc[:, ['from', 'to']].apply(sorted, axis=1)
df1.drop_duplicates()
# result -
  from to
0    A  A
1    A  B
2    A  C
4    B  B
5    B  C
8    C  C

使用^{}+^{}+^{}

df1 = df.stack().rename_axis(('from','to')).reset_index(name='value')
print (df1)
  from to  value
0    A  A    1.0
1    A  B    0.2
2    A  C    0.4
3    B  A    0.2
4    B  B    1.0
5    B  C    0.6
6    C  A    0.4
7    C  B    0.6
8    C  C    1.0

另一个numpy解决方案:

a = np.repeat(df.columns, len(df.index))
b = np.tile(df.index, len(df.columns))
c = df.values.ravel()

df1 = pd.DataFrame({'from':a, 'to':b, 'value':c})
print (df1)

  from to  value
0    A  A    1.0
1    A  B    0.2
2    A  C    0.4
3    B  A    0.2
4    B  B    1.0
5    B  C    0.6
6    C  A    0.4
7    C  B    0.6
8    C  C    1.0

编辑:

删除重复项的另一种解决方案:

df = pd.DataFrame([[1,0.2,0.4],[0.2,1,0.6],[0.4,0.6,1]])
df.columns = list('ACC')
df.index= list('ABC')
print (df)
     A    C    C
A  1.0  0.2  0.4
B  0.2  1.0  0.6
C  0.4  0.6  1.0

a = np.repeat(df.columns, len(df.index))
b = np.tile(df.index, len(df.columns))
c = df.values.ravel()

df1 = pd.DataFrame({'from':a, 'to':b, 'value':c})

df1 = (pd.DataFrame(np.sort(df1[['from','to']], axis=1), columns=['from','to'])
        .drop_duplicates())
print (df1)

  from to
0    A  A
1    A  B
2    A  C
4    B  C
5    C  C

相关问题 更多 >