Tengo un marco de datos de pandas y una serie de pandas que se ve a continuación.
df0 = pd.DataFrame({'col1':['a','b','c','d'],'col2':['b','c','e','f'],'col3':['d','f','g','a']}) col1 col2 col3 0 abd 1 bcf 2 ceg 3 dfa df1 = pd.Series(['b','g','g'], index=['col1','col2','col3']) col1 b col2 g col3 g dtype: object Como puede ver, las columnas de df0 y los índices de df1 son los mismos. Para cada índice de df1 , quiero saber si el valor de ese índice existe en la columna correspondiente de df0 . Entonces, df1.col1 es b y necesitamos buscar b solo en df0.col1 y verificar si existe.
Salida deseada:
array([True, False, True])¿Hay alguna manera de hacer esto sin usar un bucle? ¿Quizás un método nativo de numpy o pandas?
Si desea un trazador de líneas rápido usando la comprensión de lista:
[df1[i] in df0[i].unique() for i in df1.index]
Y si necesita ser una matriz:
np.array([df1[i] in df0[i].unique() for i in df1.index])
La salida es:
array([ True, False, True])
Puede transmitir df1 para verificar con df0 :
np.any(df1[None, :] == df0, axis=0) # col1 True # col2 False # col3 True # dtype: bool Tenga en cuenta que esto supone que df1.index y df0.columns tienen el mismo orden. Si no, reindex primero:
np.any(df1.reindex(df0.columns)[None, :] == df0, axis=0) Use apply para verificar si un valor df1 dado df0 en la col correspondiente de isin :
df0.apply(lambda col: col.isin([df1[col.name]])).any() # col1 True # col2 False # col3 True # dtype: boolPuede usar apply en lugar de loop .
Prueba esto:
df0 = pd.DataFrame({'col1':['a','b','c','d'],'col2':['b','c','e','f'],'col3':['d','f','g','a']}) df1 = pd.Series(['b','g','g'], index=['col1','col2','col3']) df0.apply(lambda x : df1[x.name] in x.values) # for example x <-> 'col1' check this -> 'b' in ['a','b','c','d'] # col1 True <-> 'b' in ['a','b','c','d'] # col2 False <-> 'g' in ['b','c','e','f'] # col3 True <-> 'g' in ['d','f','g','a'] # dtype: bool df0.apply(lambda x : df1[x.name] in x.values).tolist() # [True, False, True]import pandas as pd array=[] df0 = pd.DataFrame({'col1':['a','b','c','d'],'col2':['b','c','e','f'],'col3':['d','f','g','a']}) df1 = pd.Series(['b','g','g'], index=['col1','col2','col3']) for i in range(1,4): col = 'col'+str(i) array.append(df0[col].str.contains(df1[col]).any()) print(array)El método pandas.DataFrame.eq de Pandas es probablemente el más simple.
df0.eq(df1).any() col1 True col2 False col3 True dtype: boolPuede hacer uso de la transmisión :
(df0 == df1).any().valuesTambién funciona con NumPy ndarrays:
assert (df0.columns == df1.columns).all() (df0.values == df1.values).any(axis=0)Producción:
array([ True, False, True])