Создайте одну строку DataFrame
и merge
с оригиналом:
a = pd.DataFrame(v, index=[0]).merge(df)['item']
print (a)
0 3
Name: item, dtype: int64
Другое решение с query
, но если значения строк dict
необходимо добавить еще "
:
v1 = {k: '"{}"'.format(v) if isinstance(v, str) else v for k, v in v.items()}
print (v1)
{'size': 1, 'color': '"red"'}
df = df.query(' & '.join(['{}=={}'.format(i,j) for i, j in v1.items()]))['item']
print (df)
1 3
Name: item, dtype: int64
В выводе возможны 3 способа - Series
с большим количеством значений, одним значением или пустым, поэтому была создана вспомогательная функция:
def get_val(v):
x = pd.DataFrame(v, index=[0]).merge(df)['item']
if x.empty:
return 'Not found'
elif len(x) == 1:
return x.values[0]
else:
return x.values.tolist()
print (get_val({'size':1,'color':'red'}))
3
print (get_val({'size':10,'color':'red'}))
Not found
print (get_val({'color':'red'}))
[2, 3]