Как создать новый столбец панд путем сканирования нескольких столбцов, используя циклы for? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть 25 переменных от DXCODE1 до DXCODE25, которые я хочу просмотреть, чтобы увидеть, соответствует ли какое-либо из этих значений для каждой строки icd_list. Например, в каждой строке я хочу выполнить сканирование от DXCODE1 до DXCODE25 и посмотреть, содержит ли какое-либо из них одно из следующих трех значений: «F32», «F33», «F34», если это так, то я хочу вернуть 1. Я попробовал следующее:

def scan_icd (row):
    icd_list = ['F32', 'F33', 'F34']
    for i in range(1, 26):
        dx_code_loc = 'DXCODE' + str(i)
        for j in range(0, len(icd_list)):
            if icd_list[j] in row[dx_code_loc]:
                return 1

df['ICD_DX'] = df.apply(scan_icd, axis=1)

Но я получил эту ошибку:

TypeError: ("argument of type 'float' is not iterable", 'occurred at index 1')

Также я хотел бы сделать его гибким, чтобы я мог как-то указать код icd в виде списка в параметре. Но я не знаю, как применять синтаксис:

def scan_icd (row, icd_list):
    icd_list = icd_list
    for i in range(1, 26):
        dx_code_loc = 'DXCODE' + str(i)
        for j in range(0, len(icd_list)):
            if icd_list[j] in row[dx_code_loc]:
                return 1

df['ICD_DX'] = df.apply(scan_icd (['F32', 'F33', 'F34']), axis=1)

TypeError: apply() got multiple values for argument 'axis'

===================

Edit:

Столбцы помечены как DXCODE1, DXCODE2, ... DXCODE25

1 Ответ

0 голосов
/ 24 апреля 2018

Я думаю, что apply выполнит ту работу, которую вы хотите

icd_list = ['F32', 'F33', 'F34']
df['ICD_DX'] = df.apply(lambda row: 1 if row.isin(icd_list).any() else 0, axis=1)

Вы проверяете, есть ли какой-либо элемент icd_list в вашем row

РЕДАКТИРОВАТЬ: если вы хотитечтобы сохранить ваши циклы for (извините, я сначала не видел это требование), я бы сделал:

def scan_icd (row, icd_list):
    for i in range(1, 26):
        dx_code_loc = 'DXCODE' + str(i)
        for j in range(0, len(icd_list)):
            if icd_list[j] in row[dx_code_loc]:
                return 1
    return 0 # return 0 if none match
icd_list = ['F32', 'F33', 'F34']
df['ICD_DX'] = df.apply(scan_icd, args=([icd_list]), axis=1) 
# note the list of the list icd_list in args

EDIT 2: чтобы указать столбцы, вы можете сделать:

list_col = ['DXCODE' + str(i) for i in range(1,26)]
df['ICD_DX'] = df.apply(lambda row: 1 if row[list_col].isin(icd_list).any() else 0, axis=1)
# see the difference is with row[list_col]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...