Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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_Dataframe - Fatal编程技术网

在python中,如何替换给定特定条件的列?

在python中,如何替换给定特定条件的列?,python,dataframe,Python,Dataframe,我有一个包含多个列的dataframe,如下所示 Chr1 Cufflinks exon 28354206 28354551 . . . gene_id "XLOC_008369"; transcript_id "TCONS_00014347"; exon_number "1"; oId "CUFF.2405.1"; class_code "u"; tss_id "TSS10073"; Chr1 Cufflinks exon 2878554

我有一个包含多个列的dataframe,如下所示

Chr1    Cufflinks   exon    28354206    28354551    .   .   .   gene_id "XLOC_008369"; transcript_id "TCONS_00014347"; exon_number "1"; oId "CUFF.2405.1"; class_code "u"; tss_id "TSS10073";
Chr1    Cufflinks   exon    28785549    28786194    .   .   .   gene_id "XLOC_008370"; transcript_id "TCONS_00014348"; exon_number "1"; oId "CUFF.2441.1"; class_code "u"; tss_id "TSS10074";
Chr1    Cufflinks   exon    29328712    29329210    .   .   .   gene_id "XLOC_008371"; transcript_id "TCONS_00014349"; exon_number "1"; oId "CUFF.2495.1"; class_code "u"; tss_id "TSS10075";
Chr1    Cufflinks   exon    29427951    29428406    .   .   .   gene_id "XLOC_008372"; transcript_id "TCONS_00014350"; exon_number "1"; oId "CUFF.2506.1"; class_code "u"; tss_id "TSS10076";
Chr1    Cufflinks   exon    29460116    29460585    .   .   .   gene_id "XLOC_008373"; transcript_id "TCONS_00014351"; exon_number "1"; oId "CUFF.2509.1"; class_code "u"; tss_id "TSS10077";
我想做的是,如果我列表中的任何项目出现在数据框的一列中,那么我将第二列从
袖扣
替换为
lincRNA

一个问题是,我用于在字典中生成键的列在数据帧中有多行,因此我只获得唯一键,因此输出的行总数与输入的行数不同

这是我到目前为止的代码

#!/usr/bin/env python

file_in = open("lincRNA_final_transcripts.fa")
file_in2 = open("AthalianaslutteandluiN30merged.gtf")
file_out = open("updated.gtf", 'w')

sites = []
result = {}

for line in file_in:
    line = line.strip()
    if line.startswith(">"):
        line = line[1:]
        gene = str.split(line, ".")
        gene = gene[0]
        sites.append(gene)


for line2 in file_in2:
    line2 = line2.strip().split()
    line3 = str.split(line2[11], ";")
    line3 = line3[0]
    line3 = line3[1:-1]
    result[line3] = line2


for id in sites:
    id2 = str(id)
    if id2 in result.keys():
        result[id][1] = "lincRNA"

for val in result.values():
    file_out.write("\t".join(val))
    file_out.write("\n")

我将试着对您在中如何执行此操作进行演练。Pandas是一个用于处理数据帧的python库,通过学习它,可以轻松地进行数据帧操作

  • 安装熊猫

    sudo pip install pandas
    
  • 将数据加载到数据框对象中。gtf似乎是一个以制表符分隔的文件,所以将
    \t
    作为分隔符传递。如果没有标题行传递
    None
    ,如果第一行是标题,则传递0。有关参数的详细信息,请参见

  • 检查第8列中的字符串是否包含也包含在
    站点
    列表中的子字符串。我们将使用

  • 如果第8列包含与
    站点
    列表中的元素匹配的子字符串,则使用布尔索引将
    袖扣
    更改为
    lincRNA
    。有关熊猫索引的详细信息,请参见

    df.loc[mask,1] = 'lincRNA'
    

  • 编辑:使用
    str.contains
    检查pandas列是否包含列表中的元素

    你能解释什么是df吗?除非首字母缩略词被广泛使用(即它至少应该在维基百科消歧页面上列出),那么,对于那些能够回答你的问题的人来说,它基本上是毫无意义的。对不起,它是一个数据框或多栏文本文件。我已经编辑了我的问题。你为什么要重新发明轮子?Python中有非常完善的用于数据/数据帧操作的库,比如。当我读取gtf文件时,我得到了这个错误“ValueError:第48行中预期有18个字段,SAW19”。你认为我做错了什么?@upendra Pandas期望每一行都有相同的数字列,在这种情况下,它期望18。但是,在第48行中,似乎有19列。最好打开文件,看看是否有额外的制表符或分号。没错,有几行有额外的列。有没有办法处理这些额外的栏目?@upendra我已经使用另一个函数编辑了我的回复,以进行匹配。您不再需要使用分号作为分隔符,这将阻止出现其他列。它终于起作用了。非常感谢你的帮助。非常感谢
    sites = ["XLOC_008369", "XLOC_008369"]
    pattern = '|'.join(sites)
    mask = df[8].str.contains(pattern)
    
    df.loc[mask,1] = 'lincRNA'