跨不同列的范围应用函数

2024-09-30 22:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它在两个不同的列中查找某些字符串,如果满足函数条件,则返回原始行值:

def functionator(row):
    if 'J44' in row['0_c']:
        if 'J44' in row['A0']:
            return row['0_c']
        else:
            return np.nan
    elif 'I50' in row['0_c']:
        if 'I50' in row['A0']:
            return row['0_c']
        else:
            return np.nan
    elif 'I51' in row['0_c']:
        if ('I50' or 'I51') in row['A0']:
            return row['0_c']
        else:
            return np.nan
    elif 'F03X' in row['0_c']:
        if ('F00' or 'F01' or 'F02') in row['A0']:
            return row['0_c']
        else:
            return np.nan
    elif 'N18' in row['0_c']:
        if 'N18' in row['A0']:
            return row['0_c']
        else:
            return np.nan
    else:
        return np.nan

df['0_c'] = df.apply(functionator, axis=1)

但是,我想在一系列列上应用这个函数,所以我不想只在row['0_c']上检查它,而是要在row['i_c'] for i in range(n)上检查它,并在row['Ai'] for i in range(m)的范围内检查它

提前感谢您的帮助!你知道吗


Tags: or函数inreturnifnpnana0
1条回答
网友
1楼 · 发布于 2024-09-30 22:15:58

这种代码效率非常低。您应该首先对其进行重组,以便对向量而不是标量进行操作:

def vectorator(df, col1, col2):
    col_0_c = df[col1].str.contains
    col_A0 = df[col2].str.contains

    J44 = col_0_c('J44') & col_A0('J44')
    I50 = col_0_c('I50') & col_A0('I50')
    I51 = col_0_c('I51') & col_A0('I5[01]')
    F03X = col_0_c('F03X') & col_A0('F0[012]')
    N18 = col_0_c('N18') & col_A0('N18')

    matches = J44 | I50 | I51 | F03X | N18
    df[col1][~matches] = np.nan

然后就可以轻松地运行几次:

for col1i in range(n):
    for col2i in range(m):
        vectorator(df, '{}_c'.format(col1i), 'A{}'.format(col2i))

相关问题 更多 >