我从人们那里收到的tsv文件通常采用以下两种格式之一:
# format 1
sample 100 200 1
sample 200 300 2
sample 300 400 3
sample 400 500 X
或
# format 2
sample 100 200 chr1
sample 200 300 chr2
sample 300 400 chr3
sample 400 500 chrX
有时我需要文件采用第一种格式,有时我需要文件采用第二种格式。我知道在运行python代码之前需要使用哪种格式,因此我已经收到了他们的csv文件,如果我有格式1的文件并且需要格式2的文件,请运行以下awk脚本:>
awk '{print $1, $2, $3, "chr"$4}' tester.csv
其输出格式1类似于格式2,并且由我的python代码解释为文本文件,没有问题。我可以使用sed反过来做同样的事情:
sed 's/chr//' testerchr.txt
其输出格式2类似于格式1。然后运行我的python代码,其比较如下:
testchr = [(1, 'ACGTGCTAGCTG'), (2, 'ACGATGCTAGCT'), (3, 'GCTCGT')]
regions = pd.read_csv('./tester.csv', sep='\t', names=['Sample', 'pos1', 'pos2', 'Chr'])
for x,y in testchr: # [(1, ACGTGCTAGCTGA), (2, ACGATGCTAGCT), (3, GCTCGT)]
chrm = str(x)
for u,v,a,b in zip(regions.Sample, regions.pos1, regions.pos2, regions.Chr):
if str(b) == chrm:
#process data
所以通常我有一个元组列表
如果我对数据进行预处理(在python代码之前使用awk或sed命令),则不会有任何问题。我只是想知道是否有人可以提出一种无需预处理数据的方法。本质上,我的python代码可以采用两种格式的数据并正常运行,而无需对输入进行任何修改,而无需让程序预先知道输入文件的格式。
谢谢, 丹尼斯
答案 0 :(得分:1)
您可以使其成为函数,并为格式1和格式2设置一个值。例如,如果val ==则将'Char'列更改为格式1,否则将其更改为格式2:
def myFuction(df, val):
if val == 1:
df['Chr'] = df['Chr'].str[3:] # strip first 3 characters
# do stuff with format 1
else:
df['Chr'] = 'chr'+df['Chr'] # add 'chr' in front
# do stuff with format 2
format_val = input('Format Value: ')
myFunction(df, int(format_val))