Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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
如何将*.csv文件的列从一个列分离到多个列(Python、BioPython、Pandas)?_Python_Pandas_Csv_Bioinformatics_Biopython - Fatal编程技术网

如何将*.csv文件的列从一个列分离到多个列(Python、BioPython、Pandas)?

如何将*.csv文件的列从一个列分离到多个列(Python、BioPython、Pandas)?,python,pandas,csv,bioinformatics,biopython,Python,Pandas,Csv,Bioinformatics,Biopython,我还是一个初学者,我的朋友(目前还没有回答)给我提供了一个从Ensembl.org下载基因组序列并使用字典将其写入*.csv文件的代码。不幸的是,该文件只包含一列和89870行,我不知道如何修复它。这将使我的计数工作变得轻松,因为它在绘图时表现得很怪异。我不知道哪里会出错。代码如下: from Bio.SeqIO.FastaIO import FastaIterator record_ids = [] records = [] with open("equus_cds.fa&quo

我还是一个初学者,我的朋友(目前还没有回答)给我提供了一个从Ensembl.org下载基因组序列并使用字典将其写入*.csv文件的代码。不幸的是,该文件只包含一列和89870行,我不知道如何修复它。这将使我的计数工作变得轻松,因为它在绘图时表现得很怪异。我不知道哪里会出错。代码如下:

from Bio.SeqIO.FastaIO import FastaIterator

record_ids = []
records = []

with open("equus_cds.fa") as handle:
     for record in FastaIterator(handle):
            record_ids.append(record.id)
            records.append(record)

data_cds = {}

for record in records:
    data_cds[record.id] = {'A': 0, 'G': 0, 'C': 0, 'T': 0, 'N': 0}
    for letter in str(record.seq):
        data_cds[record.id][letter] += 1

import csv

with open('data_cds.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter = "\t")
    writer.writerow(['ID', 'A', 'G', 'C', 'T', 'N'])
    for key, values in data_cds.items():
        writer.writerow([key, values['A'], values['G'], values['C'], values['T'], values['N']])

with open ("data_cds.csv") as file:
    print (file.readline())
    for lines in file.readlines():
        print(lines)
输出显示一个滚动目录,但有点移位:

    ID  A   G   C   T   N



ENSECAT00000046986.1    67  64  83  71  0



ENSECAT00000031957.1    81  83  75  85  0
等等,想象一下八万多行。 然后我想计算所有“N”的总和(它并不总是零),我不知道如何使用这种格式。。。 提前谢谢

编辑:我已经从这里下载了序列:,解压缩:

handle = gzip.open('file1.fa.gz')
with open('equus_cds.fa', 'wb') as out:
    for line in handle: 
        out.write(line)
然后我发布的代码如下。*.csv文件始终包含一个特定基因的名称(ID-ENSCAT000…等),然后是氮碱基(a、T、G、C)和未知碱基(N)。整个文件有8k行,但只有一列,我希望将其正确分开(如果可能的话,每个基到一列),因为这样可以更容易地计算整个文件中每个基的数量(具体是多少个N)。 我想知道这一点的原因是,当我绘制一个图时,我比较了两个序列,cds(编码序列)和cDNA(互补DNA),减去N后,图的行为很奇怪,cds比cDNA大,这是胡说八道。以下是绘图的代码:

    data1 = pd.read_csv ("data_cds.csv", delimiter="\t")

data1['x'] = (data1['G'] + data1['C'] - data1['N']) / (data1['A'] +     data1['G'] + data1['C'] + data1['T'] - data1['N'])
data1['x'].plot.hist(bins=2000)
plt.xlim([0, 1])
plt.xlabel("cds GC percentage")
plt.title("Equus caballus", style="italic")
我在为我的论文分析哺乳动物,我并没有在每一个物种身上遇到这个问题,但这仍然足够。我希望我的问题现在更容易理解

编辑2:

我不是数学很差,就是这里太晚了,或者文件有点奇怪。。。为什么N个碱基的和是不同的

df['N'].sum()
3504.0

df['cds_wo_N'] = df["A"]+df["G"]+df["C"]+df["T"]-df["N"]
df['cds_wo_N'].sum()
88748562.0

df['cds_w_N'] = df["A"]+df["G"]+df["C"]+df["T"]+df["N"]
df['cds_w_N'].sum()
88755570.0

df['N_subt'] = df['cds_w_N']-df['cds_wo_N']
df['N_subt'].sum()
7008.0

您拥有的脚本正在创建以制表符分隔的输出文件,而不是以逗号分隔的输出文件。如果删除
分隔符='\t'
参数,它将默认为逗号

其次,您似乎得到了额外的空行。打开输出文件时,通过添加
newline='
参数删除这些内容。这是在中指定的

这将产生如下结果:

ID,A,G,C,T,N
ENSECAT00000046986.1,67,64,83,71,0
ENSECAT00000031957.1,81,83,75,85,0

您可以使用Python对
.gz
文件进行解压缩,如下所示:

import shutil
import gzip

with gzip.open('Equus_caballus.EquCab3.0.cds.all.fa.gz', 'rb') as f_in, \
    open('equus_cds.fa', 'wb') as f_out:
    shutil.copyfileobj(f_in, f_out)
SeqIO
有一个方法。如果您将它与其他工具结合使用,您可以更简洁地编写代码。我们还将直接将所有内容放在pandas.DataFrame中,而不必经过编写CSV文件的中间步骤

from collections import Counter
from Bio import SeqIO
import pandas as pd
import matplotlib.pyplot as plt

record_dict = SeqIO.to_dict(SeqIO.parse("Equus_caballus.EquCab3.0.cds.all.fa", "fasta"))
record_dict = {record_id: Counter(record_seq) for record_id, record_seq in record_dict.items()}
df = pd.DataFrame.from_dict(record_dict, orient='index')
我们的数据框架看起来像:

A. G C T N ENSECAT00000046986.1 67 64 83 71 楠 ENSCAT00000031957.1 81 83 75 85 楠 ENSECAT00000038711.1 85 59 82 59 楠 ENSECAT00000058645.1 74 66 82 78 楠 ENSCAT00000058952.1 69 63 82 71 楠 ...
您正在创建一个制表符分隔的输出文件(不是逗号分隔的文件),这是您想要的吗?如果没有,请删除
delimiter=“\t”
我试图更具体一些,希望现在更清楚。非常感谢您,这是一个非常漂亮和优雅的调整!我试着计算N个碱基,但这很奇怪,也许这解释了为什么这些图表现得很奇怪(CD不能大于cDNA),我再次编辑了我的问题,你能看一下吗?@Nautilus看到我的编辑。
from collections import Counter
from Bio import SeqIO
import pandas as pd
import matplotlib.pyplot as plt

record_dict = SeqIO.to_dict(SeqIO.parse("Equus_caballus.EquCab3.0.cds.all.fa", "fasta"))
record_dict = {record_id: Counter(record_seq) for record_id, record_seq in record_dict.items()}
df = pd.DataFrame.from_dict(record_dict, orient='index')