Supongamos que tengo un marco de datos como el siguiente:
df = pd.DataFrame({'a':[1,2,3,4],'b':[2,3,4,5],'c':[3,4,5,6],'d':[5,3,2,4]}) Quiero verificar si los elementos en la columna d existen en otro lugar en su fila correspondiente. Así que el resultado que quiero es
[False, True, False, True]Con ese fin, usé
df.apply(lambda x: x['d'] in x[['a','b','c']], axis=1) pero esto de alguna manera me está dando [False, False, False, False] .
Aprovechando la transmisión numpy, puede hacerlo fácilmente:
(df[['d']].to_numpy() == df.to_numpy())[:, :-1].any(axis=1)Producción:
array([False, True, False, True])Usar numpy es lo más rápido que puede obtener.
Tratar:
out = (df[['a','b','c']].T==df['d']).any()Producción:
0 False 1 True 2 False 3 True dtype: boolUse eq para transmitir la comparación de igualdad entre las columnas. Luego verifique si hay coincidencias en la fila:
df.drop(columns='d').eq(df['d'], axis=0).any(axis=1).array <PandasArray> [False, True, False, True] Length: 4, dtype: boolSpeedwise, una opción numpy es la mejor.
Prueba con
df.eq(df.pop('d'),axis=0).any(1)#.values 0 False 1 True 2 False 3 True dtype: boolNecesita agregar 'valores':
df.apply(lambda x: x['d'] in x[['a','b','c']].values, axis=1) Out[11]: 0 False 1 True 2 False 3 True dtype: boolLo que ha escrito es comprobar si x['d'] está en el conjunto de claves de x[['a','b','c']] no valores. Los diccionarios funcionan de manera similar:
1 in {'a': 1, 'b': 2} Out[30]: False 1 in {'a': 1, 'b': 2}.values() Out[31]: True