Преобразование текстового файла в матрицу смежности

У меня есть вопрос, аналогичный опубликованному в Преобразование матрицы смежности в файл csv

Я хочу преобразовать вывод матрицы смежности из ARACNE в файл csv, используя python (или, возможно, R).

Файл adj настроен так, чтобы показывать один ген справа и каждое его взаимодействие с другими генами. Например файл a.csv как:

A B 0.4 C 0.3
B C 0.1 E 0.4
C D 0.2 E 0.3

Итак, выше, A и B взаимодействуют друг с другом, и значение этого взаимодействия равно 0,4. A и C › › взаимодействуют друг с другом, и значение равно 0,3 и так далее.

Я хочу изменить макет, поэтому я получаю файл b.csv как...

A B 0.4
A C 0.3
B C 0.1
B E 0.4
C D 0.2
C E 0.3

По сути, мне нужен список всех взаимодействующих узлов и соответствующих значений, чтобы я мог загрузить файл в Cytoscape и построить сеть.

В этом посте есть отличный ответ с использованием Python. Что если я хочу преобразовать формат b.csv обратно в a.csv? Я почесал голову, но не могу найти решение. Я хотел бы увидеть, как Python может творить чудеса!

Спасибо за ответы. -Сяойонг


person Xiaoyong Fu    schedule 27.06.2020    source источник


Ответы (1)


Это можно сделать с помощью pandas.Dataframe.groupby.

import pandas as pd

df = pd.read_csv('b.csv', delimiter=' ', header=None)

data = '' 
for key, value in df.groupby([0]):
    for i,item in enumerate(value.values):
        if i == 0:
            data += item[0]
        for itm in item[1:]:
            data += ' '+str(itm)
    data += '\n'

#Saving the string
with open('a.csv', 'w') as f:
    f.write(data)

Данные в b.csv были:

A B 0.4
A C 0.3
B C 0.1
B E 0.4
C D 0.2
C E 0.3
C F 0.3
A D 0.3

Сгенерировать a.csv это:

A B 0.4 C 0.3 D 0.3
B C 0.1 E 0.4
C D 0.2 E 0.3 F 0.3
person Mohnish    schedule 27.06.2020
comment
Это здорово, Мохниш. Однако у меня неравное количество линий A, B, C. Как с этим бороться, кроме решения i%2 != 0? В очередной раз благодарим за помощь! - person Xiaoyong Fu; 27.06.2020
comment
@XiaoyongFu Вы имеете в виду, что a.csv может содержать что-то вроде C D 0.2 E 0.3 F 0.3? - person Mohnish; 27.06.2020
comment
Да. На самом деле у меня есть длинный текстовый файл, содержащий все пары взаимодействий и соответствующую им интенсивность взаимодействия (третий столбец). Количество пар взаимодействия для каждого узла (как A, B, C, ... в первом столбце) разное. Поэтому в выходном CSV-файле также будут строки разной длины. Спасибо за ответ на мой вопрос! - person Xiaoyong Fu; 27.06.2020
comment
@XiaoyongFu Я обновил ответ, новый код будет преобразовывать b.csv в a.csv без особых ограничений. - person Mohnish; 28.06.2020
comment
Привет, Мохниш, твой скрипт Python действительно решил мой вопрос. Большое спасибо! - person Xiaoyong Fu; 30.06.2020