将水平对齐的文本文件解析为DataFrame

2024-05-16 01:49:06 发布

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

我正在处理txt文件中的数据,这些数据是水平对齐的,我希望将其对齐到列中,例如在DataFrame中

每行开头的大写代码(ID、AC等)应为列名。在提供的示例中有更多的代码,当对象没有特定代码的信息时,它应该为空

每个对象由//分隔。 所有代码的列表:['ID', 'AC', 'AS', 'SY', 'DR', 'RX', 'WW', 'CC', 'ST', 'DI', 'OX', 'HI', 'OI', 'SX', 'AG', 'CA', 'DT']

问题是有些代码会多次出现,比如CC或OX。我试图将其放入dataframe并转置,但老实说,我一直在研究如何将列与文本文件中的适当元素相匹配,以及当实体没有特定代码的信息时该怎么办

ID   #16-15
AC   CVCL_KA96
DR   RCB; RCB4635
DR   Wikidata; Q54422067
RX   PubMed=25400923;
CC   Monoclonal antibody isotype: IgM.
CC   Monoclonal antibody target: UniProtKB; Q5T5X7; Human BEND3.
OX   NCBI_TaxID=10090; ! Mus musculus
OX   NCBI_TaxID=10116; ! Rattus norvegicus
HI   CVCL_4032 ! P3X63Ag8.653
CA   Hybridoma
DT   Created: 22-08-17; Last updated: 07-09-18; Version: 2
//

我希望数据按列组织,例如: enter image description here


Tags: 数据对象代码信息iddthirx
1条回答
网友
1楼 · 发布于 2024-05-16 01:49:06

这就是你要找的吗

我在没有pandas的情况下完成了这项工作,但是基于问题中的文件示例的输出与您期望的类似

import csv
import itertools
from collections import defaultdict

with open("sample.txt") as f:
    lines = f.readlines()

lines = [l.strip().split('   ') for l in lines if l != '//']

data = defaultdict(list)

for line in lines:
    key, values, = line
    data[key].append(''.join([v for v in values.split(";")]))

with open("test.csv", "w") as outfile:
    writer = csv.writer(outfile)
    writer.writerow(data.keys())
    writer.writerows(itertools.zip_longest(*data.values()))

输出:

enter image description here

编辑:使用pandas

import pandas as pd


codes = [
    'ID', 'AC', 'AS', 'SY', 'DR', 'RX', 'WW', 'CC', 'ST', 'DI', 'OX', 'HI',
    'OI', 'SX', 'AG', 'CA', 'DT',
]


with open("sample.txt") as f:
    lines = f.readlines()

lines = [l.strip().split('   ') for l in lines if l != '//']
print(lines)

data = {c: [] for c in codes}

for line in lines:
    key, values, = line
    data[key].append(''.join([v for v in values.split(";")]))


df = pd.DataFrame.from_dict(data, orient='index').transpose()
df.to_csv("test_2.csv", index=False)

相关问题 更多 >