Сравнение неопределенной строки с известной строкой в ​​питон-пандах - PullRequest
0 голосов
/ 15 октября 2018

Я получаю файлы 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

Так что обычно у меня есть список кортежей

Если я предварительно обработаю данные (используя команду awk или sed до кода Python), у меня никогда не возникнет никаких проблем.Мне просто интересно, может ли кто-нибудь предложить способ, которым мне не нужно было предварительно обрабатывать данные.По сути, мой код Python может принимать данные в любом формате и функционировать должным образом , не внося никаких изменений во входные данные и не сообщая программе заранее, какой формат входного файла: .

Спасибо, Деннис

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете сделать это функцией и установить значение для формата 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...