Возведение матрицы в квадрат в python

#python #python-3.x #matrix #biopython #skbio

#python #python-3.x #матрица #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 = 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
 

(вот mor для biopython)
большое спасибо за вашу помощь


Другие примеры

 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 
 

и

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

Комментарии:

1. Что вы пробовали до сих пор?

2. Во втором примере SP2, SP1 имеет значение 3 … итак, не могли бы вы объяснить, почему второй вывод имеет значение не 3, а 1?

3. Вы правы, я допустил ошибку, извините

Ответ №1:

Я думаю, это то, что вы ищете, более или менее:

 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
 

Комментарии:

1. Здравствуйте, спасибо, я отредактировал другой меньший пример, где ваш код не дает ожидаемого результата, можете ли вы проверить, в чем проблема, пожалуйста?

Ответ №2:

Вы могли бы использовать numpy.unique, перекрестную таблицу и переиндексацию:

 import numpy as np

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

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

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

print(res)
 

Вывод

 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)
 

Комментарии:

1. Здравствуйте, спасибо, я отредактировал другой меньший пример, где ваш код не дает ожидаемого результата, можете ли вы проверить, в чем проблема, пожалуйста?