Acelerar la función de aplicación de pandas

Para un Pandas DataFrame relativamente grande (unas pocas filas de 100k), me gustaría crear una serie que sea el resultado de una función de aplicación. El problema es que la función no es muy rápida y esperaba que pudiera acelerarse de alguna manera.

df = pd.DataFrame({ 'value-1': [1, 2, 3, 4, 5], 'value-2': [0.1, 0.2, 0.3, 0.4, 0.5], 'value-3': somenumbers..., 'value-4': more numbers..., 'choice-index': [1, 1, np.nan, 2, 1] }) def func(row): i = row['choice-index'] return np.nan if math.isnan(i) else row['value-%d' % i] df['value'] = df.apply(func, axis=1, reduce=True) # expected value = [1, 2, np.nan, 0.4, 5] 

Cualquier sugerencia es bienvenida.

Actualizar

Se puede lograr una aceleración muy pequeña (~ 1.1) al almacenar en antememoria las columnas seleccionadas. func cambiaría a:

 cached_columns = [None, 'value-1', 'value-2', 'value-3', 'value-4'] def func(row): i = row['choice-index'] return np.nan if math.isnan(i) else row[cached_columns[i]] 

Pero esperaba mayores aceleraciones …

Creo que tengo una buena solución (aceleración ~ 150).

El truco no es usar apply , sino hacer selecciones inteligentes.

 choice_indices = [1, 2, 3, 4] for idx in choice_indices: mask = df['choice-index'] == idx result_column = 'value-%d' % (idx) df.loc[mask, 'value'] = df.loc[mask, result_column]