将不确定字符串与python pandas中的已知字符串进行比较

时间:2018-10-15 20:25:08

标签: python python-3.x pandas

我从人们那里收到的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代码可以采用两种格式的数据并正常运行,而无需对输入进行任何修改,而无需让程序预先知道输入文件的格式

谢谢, 丹尼斯

1 个答案:

答案 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))