In NumPy, it can be vectorized to find as many lines as possible, for example:
def select_rows(df,search_strings): unq,IDs = np.unique(df,return_inverse=True) unqIDs = np.searchsorted(unq,search_strings) return df[((IDs.reshape(df.shape) == unqIDs[:,None,None]).any(-1)).all(0)]
Run Example -
In [393]: df Out[393]: ABC 0 apple banana pear 1 pear pear apple 2 banana pear pear 3 apple apple pear In [394]: select_rows(df,['apple','banana']) Out[394]: ABC 0 apple banana pear In [395]: select_rows(df,['apple','pear']) Out[395]: ABC 0 apple banana pear 1 pear pear apple 3 apple apple pear In [396]: select_rows(df,['apple','banana','pear']) Out[396]: ABC 0 apple banana pear
source share