Вы можете построить маску с помощью np.logical_and
(or
) + reduce
в зависимости от того, является ли условие любой строкой, которая удовлетворяет всем условиям, или любой строкой, которая удовлетворяет какому-либо условию соответственно.
m = np.logical_and.reduce([x[k] == v for k,v in filt_dict.items()])
# np.logical_or.reduce if an `|` condition
x[m]
# surname name
#1 park john
#2 park sam
Если вы хотите сделать немного более безопасным, чтобы разрешить несколько типов сравнений, мы можем использовать isin
, когда мы передаем итерацию (это не строка) и проверки равенства в противном случае.
m = np.logical_and.reduce(
[x[k].isin(v) if (hasattr(v, '__iter__') and not isinstance(v, str))
else x[k] == v for k,v in filt_dict.items()])