Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将此文本文件处理为结构化表的最佳策略?_Python_Pandas_Text Files - Fatal编程技术网

Python 将此文本文件处理为结构化表的最佳策略?

Python 将此文本文件处理为结构化表的最佳策略?,python,pandas,text-files,Python,Pandas,Text Files,我的合作者希望我将输入文本文件处理到结构化表中: 原始输入文本文件如下所示 PMID 22224631 标题-环氧化酶-2基因的765 G_C和-1195 A_G启动子变体可降低子痫前期的风险。 发现8个基因 基因CRP提到 基因GC提及 基因PTGS2提到 发现1个变体 变体I399V URL 基因PTGS1提到 发现2个变体 变量L255L URL 变量V255V URL 基因CT49提到 基因GAA提到 发现1个变体 变量Q255H URL 基因CGA提到 吉恩·塔特提到 PMID 160

我的合作者希望我将输入文本文件处理到结构化表中:

原始输入文本文件如下所示

PMID 22224631
标题-环氧化酶-2基因的765 G_C和-1195 A_G启动子变体可降低子痫前期的风险。
发现8个基因
基因CRP提到
基因GC提及
基因PTGS2提到
发现1个变体
变体I399V URL
基因PTGS1提到
发现2个变体
变量L255L URL
变量V255V URL
基因CT49提到
基因GAA提到
发现1个变体
变量Q255H URL
基因CGA提到
吉恩·塔特提到
PMID 16076618
标题1166C血管紧张素II 1型受体基因突变与先兆子痫妇女的脐血流速度测定相关。
发现13个基因
基因AGTR2提到
基因QTRT1提到
基因SLC25A10提到
基因ATM提到
PIH基因提到
基因CCL14提到
基因AGT提到
任志刚提到
基因ASAH1提到
基因AGTR1提到
基因SSD提到
吉恩·塔特提到
发现1个变体
变量D389A URL
基因ACE提到
发现2个变体
变量D389A URL
变体H389P URL
您可以看到,对于每个PMID(科学出版物的id),都有一些关于基因的信息,对于每个基因,都可能有一些关于变体的信息。输入文本非常类似于“打印”函数输出,而不是表格。然后,每个PMID块由一条空行分隔

协作需要的最后一个表类似于一个长格式表(.csv),由三层组成:PMID、gene和variant。PMID包含基因,基因包含(或不包含)变体。以上述输入文件为例:

PMID |基因|变体
22224631 | CRP |编号
22224631 |总承包商|编号
22224631 | PTGS2 | I399V
22224631 | PTGS1 | L255L
22224631 | PTGS1 | V255V
22224631 | CT49 |号
22224631 | GAA | Q255H
.......  |  .....
我没有太多在Python中处理原始文本文件到表的经验

我的想法是先用正则表达式去掉多余的单词。我试着读入这个文本文件,它会生成一个大的字符串列表,其中每个字符串都是输入文件中的一行

with open ("gene and variants.txt", "r") as myfile:
    data=myfile.readlines()

data2 = [x for x in data if not x.startswith('Title') and not 
x.startswith('Found')]
data3 = [x for x in data2 if x != " \t\n"]
data4 = [x.strip(" Mentions\n") for x in data3]
data4 = [x.strip(" URL") for x in data4]
data4 = [x.replace("Gene\t", "Gene") for x in data4]
data4 = [x.replace("PMID\t", "PMID ") for x in data4]
data4 = [x.replace("Variant\t", "Variant") for x in data4]
幸运的是,我能够去除大部分不必要的信息,最终得到以下字符串列表:

字符串列表如下所示:

    0
0   PMID 22224631
1   Title -765 G_C and -1195 A_G promoter varia...
2   Found 8 gene(s)
3   Gene CRP Mentions
4   Gene GC Mentions
5   Gene PTGS2 Mentions
6   Found 1 variant(s)
7   Variant I399V URL
8   Gene PTGS1 Mentions
...

然后我被卡住了。。。。下一步如何将此字符串列表转换为我的目标表?我想使用Pandas,但它似乎只将每个字符串作为dataframe中的一行和一列

我走对了吗?如果是,我下一步该怎么办


如果没有,你对我应该如何处理这个问题有什么建议吗

我对Python不是很有经验,但我的方法是创建元组。
第一个手动创建的,使第一个
PMID |基因|变体
part,
然后使用正则表达式剥离不必要的文本,并将这些元组添加到单个列表中。
然后使用字符串格式打印它们。
或者,你可以列出3个清单,一个是PMID,一个是基因,一个是变异。 然后用forloop迭代它们并打印出来以创建该表。
抱歉,无法提供具体提示。

致以最良好的祝愿

你可以使用字典

例如:

fileDict =  {Gene : [], Variant: [], PMID: []}
遍历列表,检查是Gene、Variant还是PMID,并附加值

然后你就可以这样做了

for x in fileDict['Gene']:
    print(x)

您可以按照以下步骤将文本文件转换为所需格式的数据框:

    PMID        Gene      Variant
0   22224631    CRP       No
1   22224631    GC        No
2   22224631    PTGS2     I399V
3   22224631    PTGS1     L255L
4   22224631    PTGS1     V255V
5   22224631    CT49      No
6   22224631    GAA       Q255H
7   22224631    CGA       No
8   22224631    TAT       No
9   16076618    AGTR2     No
10  16076618    QTRT1     No
11  16076618    SLC25A10  No
12  16076618    ATM       No
13  16076618    PIH       No
14  16076618    CCL14     No
15  16076618    AGT       No
16  16076618    REN       No
17  16076618    ASAH1     No
18  16076618    AGTR1     No
19  16076618    SSD       No
20  16076618    TAT       D389A
21  16076618    ACE       D389A
22  16076618    ACE       H389P
  • 使用
    read\u csv()
    导入文本文件。为了进行测试,我将上面粘贴的原始输入文本复制到一个新的文本文件中,并将其保存为
    raw_input.txt
  • 数据帧将包含一组如下格式的行:

        0
    0   PMID 22224631
    1   Title -765 G_C and -1195 A_G promoter varia...
    2   Found 8 gene(s)
    3   Gene CRP Mentions
    4   Gene GC Mentions
    5   Gene PTGS2 Mentions
    6   Found 1 variant(s)
    7   Variant I399V URL
    8   Gene PTGS1 Mentions
    ...
    
  • 我们的下一步是创建一个字典,用于存储每个
    PMID
    的信息:
  • 现在来看主要部分——这是一个逻辑,它将循环遍历字典中的每个条目,提取每个PMID的基因信息并将其格式化为一个小数据帧,然后将该数据帧添加到列表中:
  • 就这样。输出数据帧如下所示,我相信这是您想要的格式:

        PMID        Gene      Variant
    0   22224631    CRP       No
    1   22224631    GC        No
    2   22224631    PTGS2     I399V
    3   22224631    PTGS1     L255L
    4   22224631    PTGS1     V255V
    5   22224631    CT49      No
    6   22224631    GAA       Q255H
    7   22224631    CGA       No
    8   22224631    TAT       No
    9   16076618    AGTR2     No
    10  16076618    QTRT1     No
    11  16076618    SLC25A10  No
    12  16076618    ATM       No
    13  16076618    PIH       No
    14  16076618    CCL14     No
    15  16076618    AGT       No
    16  16076618    REN       No
    17  16076618    ASAH1     No
    18  16076618    AGTR1     No
    19  16076618    SSD       No
    20  16076618    TAT       D389A
    21  16076618    ACE       D389A
    22  16076618    ACE       H389P
    

    太神了非常感谢。没问题,很乐意帮忙!
    output_df = pd.concat(df_list).reset_index(drop=True)
    
        PMID        Gene      Variant
    0   22224631    CRP       No
    1   22224631    GC        No
    2   22224631    PTGS2     I399V
    3   22224631    PTGS1     L255L
    4   22224631    PTGS1     V255V
    5   22224631    CT49      No
    6   22224631    GAA       Q255H
    7   22224631    CGA       No
    8   22224631    TAT       No
    9   16076618    AGTR2     No
    10  16076618    QTRT1     No
    11  16076618    SLC25A10  No
    12  16076618    ATM       No
    13  16076618    PIH       No
    14  16076618    CCL14     No
    15  16076618    AGT       No
    16  16076618    REN       No
    17  16076618    ASAH1     No
    18  16076618    AGTR1     No
    19  16076618    SSD       No
    20  16076618    TAT       D389A
    21  16076618    ACE       D389A
    22  16076618    ACE       H389P