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