AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77425931
Accepted
Umar
Umar
Asked: 2023-11-05 20:34:18 +0800 CST2023-11-05 20:34:18 +0800 CST 2023-11-05 20:34:18 +0800 CST

Como analisar dados hierárquicos e formatá-los em um arquivo TSV em Python?

  • 772

Tenho um conjunto de dados com informações hierárquicas e números KO, e estou procurando formatar esses dados em um arquivo TSV (Tab-Separated Values) em Python, onde a primeira coluna contém números KO, a segunda coluna contém descrições, e a terceira coluna contém coluna contém uma hierarquia baseada na seção 'A' mais próxima nos dados de entrada. A hierarquia deve incluir elementos começando com 'A', 'B' e 'C' até a seção 'C' mais próxima. Além disso, se o mesmo número KO estiver presente em uma hierarquia diferente, essa hierarquia deverá ser separada por | na mesma linha, os dados de entrada estão no formato file.keg. Dados de entrada:

A09100 Metabolism
B
B  09101 Carbohydrate metabolism
C    00010 Glycolysis / Gluconeogenesis [PATH:ko00010]
D      K00844  HK; hexokinase [EC:2.7.1.1]
D      K12407  GCK; glucokinase [EC:2.7.1.2]
D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
B  09103 Lipid metabolism
C    00071 Fatty acid degradation [PATH:ko00071]
D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
A09120 Genetic Information Processing
B
B  09121 Transcription
C    03020 RNA polymerase [PATH:ko03020]
D      K03043  rpoB; DNA-directed RNA polymerase subunit beta [EC:2.7.7.6]
D      K13797  rpoBC; DNA-directed RNA polymerase subunit beta-beta' [EC:2.7.7.6]

Resultado esperado:

    KO      metadata_KEGG_Description        metadata_KEGG_Pathways
K00844  HK; hexokinase [EC:2.7.1.1]     Metabolism, Carbohydrate metabolism, Glycolysis / Gluconeogenesis
K12407  GCK; glucokinase [EC:2.7.1.2]   Metabolism, Carbohydrate metabolism, Glycolysis / Gluconeogenesis
K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]    Metabolism, Carbohydrate metabolism, Glycolysis / Gluconeogenesis|Metabolism, Lipid metabolism, Fatty acid degradation
K03043  rpoB; DNA-directed RNA polymerase subunit beta [EC:2.7.7.6]  Genetic Information Processing, Transcription, RNA polymerase
K13797  rpoBC; DNA-directed RNA polymerase subunit beta-beta' [EC:2.7.7.6]  Genetic Information Processing, Transcription, RNA polymerase

Eu apreciaria qualquer ajuda ou orientação sobre como processar corretamente esses dados em um arquivo TSV desejado com base nas informações hierárquicas fornecidas. Obrigado pela sua ajuda!

este é o meu código

data = """A09100 Metabolism
B
B  09101 Carbohydrate metabolism
C    00010 Glycolysis / Gluconeogenesis [PATH:ko00010]
D      K00844  HK; hexokinase [EC:2.7.1.1]
D      K12407  GCK; glucokinase [EC:2.7.1.2]
D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
B  09103 Lipid metabolism
C    00071 Fatty acid degradation [PATH:ko00071]
D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
A09120 Genetic Information Processing
B
B  09121 Transcription
C    03020 RNA polymerase [PATH:ko03020]
D      K03043  rpoB; DNA-directed RNA polymerase subunit beta [EC:2.7.7.6]
D      K13797  rpoBC; DNA-directed RNA polymerase subunit beta-beta' [EC:2.7.7.6]"""


lines = data.split('\n')

result = []

ko = None
description = None
hierarchy_names = []

for line in lines:
    parts = line.strip().split()
    if parts:
        if parts[0].startswith('A'):
            # Reset hierarchy for a new 'A' section
            hierarchy_names = [" ".join(parts[1:])]
        elif parts[0] == 'K':
            ko = parts[0]
            description = " ".join(parts[1:])
        elif parts[0] == 'D' and len(parts) >= 3:
            ko = parts[1]
            description = " ".join(parts[2:])
        else:
            hierarchy_names.append(" ".join(parts[1:]))

    if ko and description:
        hierarchy_str = ", ".join(hierarchy_names)
        result.append([ko, description, hierarchy_str])

# Add the header row
result.insert(0, ["KO", "metadata_KEGG_Description", "metadata_KEGG_Pathways"])

# Specify the filename for the TSV file
tsv_filename = "output_data.tsv"

with open(tsv_filename, 'w') as tsv_file:
    for row in result:
        tsv_file.write("\t".join(row) + "\n")

print(f"Data saved to {tsv_filename}")
python
  • 2 2 respostas
  • 60 Views

2 respostas

  • Voted
  1. Best Answer
    Timeless
    2023-11-06T00:24:35+08:002023-11-06T00:24:35+08:00

    Sugiro que você verifique o DBGETEntryParsersite da Orange Bioinformatics que lida com arquivos KEGG. Caso contrário, se você estiver tentado a usar pandas com alguma ajuda de regex, você pode tentar isto:

    import re
    
    with open("file.keg") as f:
        pat = r"^([A-D]) *(\S+)\s*(.+?)\s*(\[.+\])?(?=$)"
        data = re.findall(pat, f.read(), flags=re.MULTILINE)  regex101-demo
    import pandas as pd
    
    tmp = pd.DataFrame(data, columns=["section", "name", "attribute", "path"])
    mA = tmp["section"].eq("A"); mD = tmp["section"].eq("D")
    df = tmp.assign(entry= tmp["attribute"].where(mA).ffill()).loc[~mA]
    
    parents = (df["entry"].str.cat(df["attribute"].groupby(
            mD.ne(mD.shift()).cumsum(), sort=False)
                .transform(", ".join).where(~mD).ffill(), sep=", ")
                .rename("parents"))
    
    edges = df[["name"]].join(parents).loc[mD, ["parents", "name"]]
    
    out = (df.join(parents).loc[mD].assign(metadata_KEGG_Pathways=
            lambda x: x["attribute"].str.cat(x["path"], sep=" "))
               .groupby("name", sort=False, as_index=False).agg(
                   metadata_KEGG_Description=("metadata_KEGG_Pathways", "first"),
                   metadata_KEGG_Pathways=("parents", "|".join)))
    
    # out.to_csv("file.tsv", sep="\t", index=False) # uncomment to make a `.tsv`
    

    Saída ( em formato tabular ):

    nome metadata_KEGG_Descrição metadata_KEGG_Pathways
    K00844 Hong Kong; hexoquinase [EC:2.7.1.1] Metabolismo, Metabolismo de carboidratos, Glicólise / Gliconeogênese
    K12407 GCC; glucoquinase [EC:2.7.1.2] Metabolismo, Metabolismo de carboidratos, Glicólise / Gliconeogênese
    K00001 E1.1.1.1, adh; álcool desidrogenase [EC:1.1.1.1] Metabolismo, Metabolismo de carboidratos, Glicólise / Gliconeogênese | Metabolismo, Metabolismo lipídico, Degradação de ácidos graxos
    K03043 rpoB; Subunidade beta da RNA polimerase dirigida por DNA [EC:2.7.7.6] Processamento de informação genética, transcrição, RNA polimerase
    K13797 rpoBC; Subunidade beta-beta' da RNA polimerase dirigida por DNA [EC:2.7.7.6] Processamento de informação genética, transcrição, RNA polimerase

    Uma visualização gráfica com networkx :

    import networkx as nx
    from itertools import chain, pairwise
    
    G = nx.from_edgelist(
        chain.from_iterable(
            [pairwise(vals) for vals in edges.agg(
                ",".join, axis=1).str.split(",").to_numpy()]),
        create_using=nx.DiGraph
    )
    

    insira a descrição da imagem aqui

    • 2
  2. Umar
    2023-11-05T21:44:42+08:002023-11-05T21:44:42+08:00

    consegui esse código obrigado

    data = """A09100 Metabolism
    B
    B  09101 Carbohydrate metabolism
    C    00010 Glycolysis / Gluconeogenesis [PATH:ko00010]
    D      K00844  HK; hexokinase [EC:2.7.1.1]
    D      K12407  GCK; glucokinase [EC:2.7.1.2]
    D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
    B  09103 Lipid metabolism
    C    00071 Fatty acid degradation [PATH:ko00071]
    D      K00001  E1.1.1.1, adh; alcohol dehydrogenase [EC:1.1.1.1]
    A09120 Genetic Information Processing
    B
    B  09121 Transcription
    C    03020 RNA polymerase [PATH:ko03020]
    D      K03043  rpoB; DNA-directed RNA polymerase subunit beta [EC:2.7.7.6]
    D      K13797  rpoBC; DNA-directed RNA polymerase subunit beta-beta' [EC:2.7.7.6]"""
    
    lines = data.split('\n')
    
    result = []
    
    ko = None
    description = None
    hierarchy_names = []
    unique_ko_hierarchy = {}
    
    for line in lines:
        parts = line.strip().split()
        if parts:
            if parts[0].startswith('A'):
                # Reset hierarchy for a new 'A' section
                hierarchy_names = [" ".join(parts[1:])]
            elif parts[0] == 'K':
                ko = parts[0]
                description = " ".join(parts[1:])
            elif parts[0] == 'D' and len(parts) >= 3:
                ko = parts[1]
                description = " ".join(parts[2:])
            else:
                hierarchy_names.append(" ".join(parts[1:]))
    
        if ko and description:
            hierarchy_str = ", ".join(hierarchy_names)
            if ko in unique_ko_hierarchy:
                unique_ko_hierarchy[ko].append(hierarchy_str)
            else:
                unique_ko_hierarchy[ko] = [hierarchy_str]
    
    # Add the header row
    result.append(["KO", "metadata_KEGG_Description", "metadata_KEGG_Pathways"])
    
    for ko, hierarchies in unique_ko_hierarchy.items():
        result.append([ko, description, "|".join(hierarchies)])
    
    # Specify the filename for the TSV file
    tsv_filename = "output_data.tsv"
    
    with open(tsv_filename, 'w') as tsv_file:
        for row in result:
            tsv_file.write("\t".join(row) + "\n")
    
    print(f"Data saved to {tsv_filename}")
    
    • 0

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve