Обновить значение панд, когда условие регулярного выражения удовлетворено с заменой регулярного выражения - PullRequest
0 голосов
/ 20 октября 2019

Предоставление DataFrame, подобного этому, состоящего из более чем 10 тыс. Записей:

    RecSeq Length   Recognition Sequence    Enzymes
4023    12  CCANNNNNNTGG    BstXI
4024    12  CGANNNNNNTCC    HdeNY26I
4025    12  CGANNNNNNTGC    BcgI
4026    12  GAACNNNNNCTC    PpiI
4027    12  GAAGNNNNNCTC    Mcr10I
4028    12  GACNNNNNNGTC    AasI
4029    12  GACNNNNNNGTC    DrdI
4030    12  GACNNNNNNGTC    DseDI

Я хочу заменить любое N в столбце Recognition Sequence с помощью выражения регулярного выражения, которое заменит N на[A|C|G|T]. В настоящее время я делаю это с помощью iterrows, добавляя все записи в новый фрейм данных (условие else сохраняет строку как есть, поэтому я не включил ее код внутри). Вот как это делается:

new_df = []
    for idx, i in df.iterrows():
        if re.search('N', i[1]) != None:
            value = str(i[1])
            updated = value.replace('N', '[A|C|G|T]')
            whole_line = str(updated +','+ i[2],+','+i[0])
            new_df.append(whole_line)
            df1  = pd.DataFrame(new_df)

Этот подход кажется медленным, потому что он повторяет каждый элемент, и я знаю, что повторение всегда последний способ следовать при работе с пандами. Я хочу реализовать np.where как объяснено в другом вопросе или что-то более универсальное или мощное.

Да, каждый N должен быть заменен на [A|C|G|T]. Это то, что я делал со своим кодом.

1 Ответ

0 голосов
/ 20 октября 2019
df = pd.DataFrame({"A":['CCANNNNNNTGG']})

df
        A
0   CCANNNNNNTGG

import re
def my_func(x):
    return re.sub(r'N', [A|C|G|T], x)

df['A'] = df.A.apply(my_func)

df
0    CCA[A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T]TGG
Name: A, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...