Если я правильно понял вопрос, то что вы ищете в строке с наибольшим количеством совпадений в указанных вами столбцах.Таким образом, учитывая, что вы пример (но продлили немного дальше)
| Idx | name | age | sex | birth month | birth day |
| - | - | - | - | - | - |
| 0 | Mike | ? | m | 8 | ? |
| 1 | Julia | 10 | w | ? | ? |
| 2 | ? | 10 | w | ? | ? |
| 3 | Julia | 10 | m | ? | ? |
Если вы запросите имя = Юлия, возраст = 10, вы получите оба идентификатора (1 и 3), но если вы продолжите квалифицировать свойзапрос, чтобы спросить имя = Джулия, возраст = 10 и пол = 'w', тогда вы получите только IDX 1. Это правильно?Если так, то я думаю, что это будет работать.
import pandas as pd
df = pd.DataFrame({'Idx': [0,1,2, 3],
'name': ['Mike ', 'Julia ', '?', 'Julia'],
'sex': ['m', 'w', 'w', 'm'],
'age': [42, 52, 52, 10]})
# Here specify the full set of parameters that makes a good match
query_params = [('name','Julia'), ('sex','w'), ('age',52)]
# Now build a mask from all of the query parameters
mask = pd.DataFrame([df[x[0]]==x[1] for x in query_params])
mask
0 1 2
name False False False
sex False True True
age False True True
# We'll transpose these series to make it more readable, then sum up the number of 'matches' for each row
mask = mask.T
mask['count'] = mask.sum(axis=1)
mask
name sex age count
0 False False False 0
1 False True True 2
2 False True True 2
# Now it's just a matter of indexing back into the original dataframe where the mask matches the most fields
df.iloc[mask['count'].idxmax()]
Idx 1
name Julia
sex w
age 52