python中的矩阵平方

python中的矩阵平方,python,python-3.x,matrix,biopython,skbio,Python,Python 3.x,Matrix,Biopython,Skbio,您好,假设我有一个df,例如: G1 G2 VALUE SP1 SP2 1 SP1 SP3 2 SP1 SP4 3 SP2 SP3 4 SP2 SP4 5 SP3 SP4 6 如何将数据转换为正方形?(即,行数和列数相同) 有点像 data = [[0, 1, 2, 3], [1, 0, 4, 5], [9, 10, 0, 8, 7], [2, 4, 0, 6], [3, 5, 6, 0]] ids = ['SP1','SP2','SP3','SP4] dm

您好,假设我有一个df,例如:

G1  G2  VALUE 
SP1 SP2 1
SP1 SP3 2
SP1 SP4 3
SP2 SP3 4
SP2 SP4 5
SP3 SP4 6 
如何将数据转换为正方形?(即,行数和列数相同)

有点像

data = [[0,  1,  2,  3],
[1,  0, 4, 5],
[9, 10,  0,  8,  7],
[2, 4,  0,  6],
[3,  5,  6,  0]]

ids = ['SP1','SP2','SP3','SP4]

dm = DistanceMatrix(data, ids) (function from skbio package)
然后得到一个矩阵:

    SP1 SP2 SP3 SP4
SP1 0   1   2   3
SP2 1   0   4   5
SP3 2   4   0   6
SP4 3   5   6   0
如果你们中的一些人熟悉它,我们如何也能做同样的事情,但使用1/2矩阵:

SP1 0 
SP2 1   0   
SP3 2   4   0   
SP4 3   5   6   0
    SP1 SP2 SP3 SP4
(这是biopython的mor) 非常感谢你的帮助


其他例子

d = {'G1': ['SP1','SP2','SP2'], 'G2': ['SP3','SP3','SP1'],'VALUE' :[1,2,3]}
df = pd.DataFrame(data=d)
我应该得到:

SP1 0
SP2 3   0
SP3 1   2  0
   SP1 SP2 SP3 


我想这或多或少就是你想要的:

In [257]: df
Out[257]: 
    G1   G2  VALUE
0  SP1  SP2      1
1  SP1  SP3      2
2  SP1  SP4      3
3  SP2  SP3      4
4  SP2  SP4      5
5  SP3  SP4      6

In [258]: df.pivot(index='G1', columns='G2', values='VALUE')
Out[258]: 
G2   SP2  SP3  SP4
G1                
SP1  1.0  2.0  3.0
SP2  NaN  4.0  5.0
SP3  NaN  NaN  6.0

In [259]: df.pivot(index='G1', columns='G2', values='VALUE').fillna(value=0)
Out[259]: 
G2   SP2  SP3  SP4
G1                
SP1  1.0  2.0  3.0
SP2  0.0  4.0  5.0
SP3  0.0  0.0  6.0
针对问题的编辑:

In [277]: d = {'G1': ['SP1','SP2','SP2'], 'G2': ['SP3','SP3','SP1'],'VALUE' :[1,2,3]}

In [278]: df = pd.DataFrame(data=d)

In [279]: d = df.pivot(index='G1', columns='G2', values='VALUE').fillna(value=0).to_dict()

In [280]: for s,dd in {**d}.items(): 
     ...:     for t,v in {**dd}.items(): 
     ...:         d.setdefault(t, {})[s] = v 
     ...:

In [281]: d
Out[281]: 
{'SP1': {'SP1': 0.0, 'SP2': 3.0, 'SP3': 1.0},
 'SP3': {'SP1': 1.0, 'SP2': 2.0},
 'SP2': {'SP1': 3.0, 'SP3': 2.0}}

In [282]: pd.DataFrame(data=d)
Out[282]: 
     SP1  SP3  SP2
SP1  0.0  1.0  3.0
SP2  3.0  2.0  NaN
SP3  1.0  NaN  2.0

In [283]: pd.DataFrame(data=d).fillna(value=0)
Out[283]: 
     SP1  SP3  SP2
SP1  0.0  1.0  3.0
SP2  3.0  2.0  0.0
SP3  1.0  0.0  2.0
您可以使用,并且:

输出

G2   SP1  SP2  SP3  SP4
G1                     
SP1  0.0  1.0  2.0  3.0
SP2  0.0  0.0  4.0  5.0
SP3  0.0  0.0  0.0  6.0
SP4  0.0  0.0  0.0  0.0
第一步:

# find unique values from both columns (flattened)
idx = np.unique(df[['G1', 'G2']])
创建:

['SP1' 'SP2' 'SP3' 'SP4']
第二步:

# cross tabulation of G1 and G2
res = pd.crosstab(index=df['G1'], columns=df['G2'], values=df['VALUE'], aggfunc='sum')
产生:

G2   SP2  SP3  SP4
G1                
SP1  1.0  2.0  3.0
SP2  NaN  4.0  5.0
SP3  NaN  NaN  6.0
然后使用步骤1中获得的值,从步骤2重新索引数据帧:

# reindex using unique values from both columns
res = res.reindex(index=idx, columns=idx, fill_value=0).fillna(0)

到目前为止,您尝试了什么?在第二个示例SP2中,SP1的值为3。。。那么,你能解释一下为什么第二个输出的值不是3而是1吗?你是对的,我犯了一个错误抱歉你好,谢谢,我用另一个较小的示例编辑了你的代码没有给出预期的输出,你能检查一下问题出在哪里吗?你好,谢谢,我用另一个较小的例子编辑了你的代码没有给出预期的输出,你能检查一下问题出在哪里吗?
G2   SP2  SP3  SP4
G1                
SP1  1.0  2.0  3.0
SP2  NaN  4.0  5.0
SP3  NaN  NaN  6.0
# reindex using unique values from both columns
res = res.reindex(index=idx, columns=idx, fill_value=0).fillna(0)