Tengo un marco de datos de pandas con esta estructura:
df_prueba
V | A | B | C | D -10 | nan | nan | nan | nan -9.9 | 10 | 1 | -2200 | 100 -9.8 | 11 | 2 | -2211 | 1 Me gustaría agregar una nueva columna minimum_difference que contenga el nombre de la columna con el valor absoluto más pequeño para esa fila específica (ignorando V ), así:
V | A | B | C | D | minimum_difference -10 | nan | nan | nan | nan | nan -9.9 | 10 | 1 | -2200 | 100 | B -9.8 | 11 | 2 | -2211 | 1 | DPuede usar df.drop para omitir la columna V y df.abs para convertir los valores del marco de datos a sus equivalentes absolutos, y usar df.idxmin con axis=1 para encontrar el índice (que será un nombre de columna) del más pequeño (valor absoluto:
df_test['minimum_difference'] = df_test.drop('V', axis=1).abs().idxmin(axis=1)Producción:
>>> df VABCD minimum_difference 0 -10.0 NaN NaN NaN NaN NaN 1 -9.9 10.0 1.0 -2200.0 100.0 B 2 -9.8 11.0 2.0 -2211.0 1.0 DPuede verificar si una row contiene NaN , luego poner NaN , de lo contrario, calcule el min de la fila y coloque el índice.
In [101]: import numpy as np In [102]: df['minimum_difference'] = np.where(df.isna().any(1), np.nan, df.abs().idxmin(1)) In [103]: df Out[103]: VABCD minimum_difference 0 -10.0 NaN NaN NaN NaN NaN 1 -9.9 10.0 1.0 -2200.0 100.0 B 2 -9.8 11.0 2.0 -2211.0 1.0 DAquí estoy compartiendo el fragmento de código de Mayank con poca actualización.
In [84]: df['minimum_difference'] = df.ix[:, 1:].abs().idxmin(1) In [85]: df Out[85]: VABCD minimum_difference 0 -10.0 NaN NaN NaN NaN NaN 1 -9.9 10.0 1.0 -2200.0 100.0 B 2 -9.8 11.0 2.0 -2211.0 200.0 B