Найти и заменить строки в первом столбце данных

Я не профессиональный программист, но моя текущая работа в больнице позволяет мне кодировать некоторые обходные пути для нашей ужасной системы EHR. Ниже приводится часть моего проекта Python по визуализации лабораторных данных.

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

Этот код проверяет кортеж[0] в списке кортежей (test_and_value), состоящий из (названий лабораторных тестов, значений тестов), поиска названий лабораторных тестов с ошибками и замены их стандартными названиями лабораторных тестов.

Распространенные орфографические ошибки и их заменяющие термины находятся в другом списке кортежей (chem_fix), чтобы сохранить порядок, в котором они проверяются. Некоторые фрагменты слов с орфографическими ошибками используются вместо полных слов, поэтому проверка не может быть простой == заявление.

Конечный продукт – это список кортежей, test_and_value_f, с правильно написанными лабораторными тестами.

Соответствующие фрагменты кода:

chem_fix = [('A/G RATIO', 'A:G RATIO'), ('ALK', 'ALKALINE PHOSPHATASE'), ('ALT', 'ALT'), ('AST', 'AST'), ('BILI', 'BILIRUBIN,TOTAL'), ('BLIL', 'BILIRUBIN,TOTAL'), ('BUN/CREAT', 'BUN/CREAT RATIO'), ('BUN', 'BLOOD UREA NITROGEN'), ('CARBON', 'CO2'), ('GLOB', 'GLOBULIN'), ('RANDOM', 'GLUCOSE'), ('PROTEIN', 'TOTAL PROTEIN')]
fix_terms = [x[0] for x in chem_fix]

test_and_value_f = []
replaced = False
for lab_test, value in test_and_value:
    for count, term_needing_fix in enumerate(fix_terms):
        if term_needing_fix in lab_test:
            test_and_value_f.append((chem_fix[count][1], value))
            replaced = True
            break
    if replaced == False:
        test_and_value_f.append((lab_test, value))
    else:
        replaced = False

Образец test_and_value ввод: [(‘GLUCOSE’, ’77’), (‘BUN’, ’14’), (‘CREATININE’, ‘1.4’), (‘CALCULATED BUN/CREAT’, ’10’), (‘SODIUM’, ‘142’), (‘POTASSIUM’, ‘3.7’), (‘CHLORIDE’, ‘100’), (‘CARBON DIOXIDE’, ’30’), (‘CALCIUM’, ‘8.9’), (‘PROTEIN, TOTAL’, ‘6.5’), (‘ALBUMIN’, ‘3.4’), (‘CALCULATED GLOBIN’, ‘3.1’), (‘CALCULATED A/G RATIO’, ‘1.1’), (‘BILIRUBIN, TOTAL’, ‘0.7’), (‘ALKALINE PHOSPHATASE’, ’59’), (‘SGOT (AST)’, ‘3’)]

Образец test_and_value_f вывод: [(‘GLUCOSE’, ’77’), (‘BLOOD UREA NITROGEN’, ’14’), (‘CREATININE’, ‘1.4’), (‘BUN/CREAT RATIO’, ’10’), (‘SODIUM’, ‘142’), (‘POTASSIUM’, ‘3.7’), (‘CHLORIDE’, ‘100’), (‘CO2′, ’30’), (‘CALCIUM’, ‘8.9’), (‘TOTAL PROTEIN’, ‘6.5’), (‘ALBUMIN’, ‘3.4’), (‘GLOBULIN’, ‘3.1’), (‘A:G RATIO’, ‘1.1’), (‘BILIRUBIN,TOTAL’, ‘0.7’), (‘ALKALINE PHOSPHATASE’, ’59’), (‘AST’, ‘3’)]

Есть ли более эффективный способ сделать это?

1 ответ
1

Вы можете использовать словарь вместо списка кортежей для chem_fix, и тогда вы сможете избавиться от fix_terms. Тогда вы могли бы использовать search из модуля re в понимании списка, а затем найдите все совпадения в словаре. И вы можете использовать оператор моржа для хранения всего, что возвращается из search так как сначала вы должны убедиться, что это не None. Вот пример этого:

# there’s already a function called “compile”
# “import re” used so it doesn’t get overwritten
pattern = re.compile('|'.join(chem_fix))
pattern_search = pattern.search # method will be looked up faster
test_and_value_f = [
    (
        chem_fix[m.group(0)]
        if (m := pattern_search(lab_test)) is not None
        else lab_test,
        value
    )
    for lab_test, value in test_and_value
]

  • Выберите список кортежей, чтобы сохранить порядок, в котором происходит проверка. Нужно ли мне использовать упорядоченный dict, или порядок будет сохранен в обычном dict (работает Python 3.9). Предполагается, что чтение 3.6+ должно сохранять порядок вставки? ссылка

    – подковы

  • 2

    Да, обычный диктант должен сохранять порядок вставки, если он равен 3.9. Так что "|".join вернет строку с терминами в том же порядке, что и в словаре, поэтому вам не придется писать шаблон вручную.

    – my_first_c_program

  • 1

    поскольку value одинаково в обеих ветках, ваш else может применяться внутри выходного кортежа только к первому элементу.

    – Райндериен

  • Пришлось вручную разобрать это с помощью некоторого тестового кода, чтобы понять, как все сочетается друг с другом. Выучил: 1) как использовать if / else в понимании списка для определения значений кортежа[0] в списке кортежей 2) .join on a dict объединяет ключи 3) оператор моржа

    – подковы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *