Tengo el siguiente marco de datos:
df = pd.DataFrame([[0, 1, 7, 0, 1, 8, 3, 0], [7, 3, 4, 0, 4, 9, 7, 0]], columns=pd.MultiIndex.from_product([["first", "second"], ["A", "B", "C", "D"]])) print(df) first second ABCDABCD 0 0 1 7 0 1 8 3 0 1 7 3 4 0 4 9 7 0Quiero verificar si los valores en el primero están presentes en alguna de las columnas del segundo. Solo se debe comparar la misma fila.
El marco de datos resultante debería verse así:
ABCD 0 True True False True 1 True False True TrueCual es la mejor manera de hacer esto? Ya he jugado con df["primero"].isin(df["segundo"] pero solo compara A con A, B con B, ... También lo probé en combinación con .any() pero no puedo t parecen hacer que funcione.
¡Tu ayuda es muy apreciada!
Gracias de antemano.
Aquí hay una opción con isin y un bucle for en A,B,C,D :
seconds = df['second'] np.any([df['first'].isin(seconds[c]) for c in seconds], axis=0)Producción:
array([[ True, True, False, True], [ True, False, True, True]])Otra solución:
df['first'].apply(lambda x: x.isin(df.loc[x.name, ('second')]), axis=1)Producción:
ABCD 0 True True False True 1 True False True True np.any(df['first'].T.values[:, :, None] == df['second'].values, axis=-1).T array([[ True, True, False, True], [ True, False, True, True]])Puede usar una combinación de funciones numpy, junto con zip :
In [79]: step1 = zip(np.split(df['first'].to_numpy(),2), np.split(df['second'].to_numpy(), 2)) In [80]: step2 = [np.isin(arr1, arr2) for arr1, arr2 in step1] In [81]: np.vstack(step2) Out[81]: array([[ True, True, False, True], [ True, False, True, True]])Puede pasarlo al constructor de DataFrame para devolver un marco de datos:
pd.DataFrame(np.vstack(step2), columns = df['first'].columns) Out[82]: ABCD 0 True True False True 1 True False True True