gpt4 book ai didi

Python - 从数据行中提取字段名称并重新格式化

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:15 25 4
gpt4 key购买 nike

我有一个平面文本文件 (infile),我想对其进行重组。它有几个制表符分隔的列,看起来像这样:

 Person1    HEIGHT=60;WEIGHT=100;AGE=22
Person2 HEIGHT=62;WEIGHT=101;AGE=25
Person3 HEIGHT=64;WEIGHT=110;AGE=29

我希望它看起来像这样:

 PERSON    HEIGHT    WEIGHT    AGE
1 60 100 22
2 62 101 25
3 64 110 29

您可以看到第二列实际上包含几个以分号分隔的标题/值字段,我想将它们重组为典型的列标题行。

现在我有:

for line in infile:
line = line.split("\t")
line_meta = line[1].split(";")
print line_meta

我认为最好的解决方案是现在遍历 line_meta 变量,使用正则表达式检测标题名称(检测以多个大写字母开头并以“=”结尾的字符串),将每个标题添加到字典中作为键,然后将字符串的其余部分存储为值。然后,对于下一行,如果检测到相同的标题,则只需附加到现有字典即可。

任何人都可以帮助编写此代码或提供有关如何进行的反馈吗?

谢谢

编辑:感谢您的回复。我为此示例简化了我的数据,但这是其中一个实际元列的样子(仍然是 ; 分隔,但值类型是混合的):

       P=0.9626;IPU=.$.+1T.+1T.+;IRF=ncRNA;IUC=UTR3;IGN=NCRNA00115;IGI=NCRNA00115,RP11-206L10.16-001;IET=0;IEO=0;IEN=.;IHT=0;IHVC=0;IHD=.;IHI=.;IHN=.;IDI=.;IDN=.;ITMAF=.;ITAMR=.;ITASN=.;ITAFR=.;ITEUR=.;ITNRB=+A;ISF=.;ISD=.;ISM=.;ISX=.;

最佳答案

您可以只使用一个正则表达式来拆分键=值对:

import re

key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>\[^\s=;]+)(?:(?=;)|$)')

这个表达式使用了命名组,但如果你觉得更容易阅读,你也可以不用那些:

key_value = re.compile('([A-Z]+)=([^\s=;])(?:(?=;)|$)')

(?:..) 组是一个非捕获组;此处仅用于区分| 或符号适用的内容。该模式匹配 = 符号之前的大写字符,以及任何不是 空格、=; 字符, 前提是在值之后有 ; 字符串的结尾。

这会为每一行拆分键和值:

>>> key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>[^\s=;]+)(?:(?=;)|$)')
>>> key_value.findall('Person1\tHEIGHT=60;WEIGHT=100;AGE=22')
[('HEIGHT', '60'), ('WEIGHT', '100'), ('AGE', '22')]

这很容易变成字典:

>>> dict(key_value.findall('Person1\tHEIGHT=60;WEIGHT=100;AGE=22'))
{'AGE': '22', 'WEIGHT': '100', 'HEIGHT': '60'}

然后你可以写这些,例如,使用 csv.DictWriter() :

import csv
import re

key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>[^\s=;]+)(?:(?=;)|$)')

with open(inputfilename) as infile, open(outputfilename, 'wb') as outfile:
writer = csv.DictWriter(outfile, ('PERSON', 'HEIGHT', 'WEIGHT', 'AGE'), delimiter='\t')
writer.writeheader()

for line in infile:
person = line.split('\t', 1)[0]
row = dict(key_value.findall(line))
row['PERSON'] = person
writer.writerow(row)

基于您的真实数据样本的演示:

>>> dict(key_value.findall('       P=0.9626;IPU=.$.+1T.+1T.+;IRF=ncRNA;IUC=UTR3;IGN=NCRNA00115;IGI=NCRNA00115,RP11-206L10.16-001;IET=0;IEO=0;IEN=.;IHT=0;IHVC=0;IHD=.;IHI=.;IHN=.;IDI=.;IDN=.;ITMAF=.;ITAMR=.;ITASN=.;ITAFR=.;ITEUR=.;ITNRB=+A;ISF=.;ISD=.;ISM=.;ISX=.;\n'))
{'ISX': '.', 'ITAMR': '.', 'IDN': '.', 'ISM': '.', 'IDI': '.', 'ISF': '.', 'ISD': '.', 'ITMAF': '.', 'IUC': 'UTR3', 'IGI': 'NCRNA00115,RP11-206L10.16-001', 'ITNRB': '+A', 'IHVC': '0', 'IET': '0', 'ITASN': '.', 'ITEUR': '.', 'ITAFR': '.', 'IEO': '0', 'IEN': '.', 'IGN': 'NCRNA00115', 'IRF': 'ncRNA', 'P': '0.9626', 'IHT': '0', 'IHI': '.', 'IHN': '.', 'IPU': '.$.+1T.+1T.+', 'IHD': '.'}

关于Python - 从数据行中提取字段名称并重新格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16444530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com