2

I have a dataframe that contains multiple columns:

print(usersData):

    First name     Last name     ID1       ID2        Description         ...
0       Thomas        Shelby   TS123     T_SHE               Yeah         ...
1         Jack          Down   JD124     J_DOW               Yeah         ...
2         John           Doe   JD125     J_DOE               Yeah         ...
3        Alice          Lang   AL127     A_LAN               Yeah         ...

And I want to filter this filter based on variable criterias. I need to be able to filter using a combination of attributes that need to match a specific request. For example, if should be able to filter by First name AND Last name, like so:

firstname = "Thomas"
lastname = "Shelby"
searchResult = usersData[usersData['First name'] == firstname & usersData['Lastname'] == lastname]

But I want it to be dynamic, meaning I want to be able to do something like:

criterias = {"First name": "Thomas", "Last name": "Shelby"}
searchResult = usersData[for criteria in criterias: (usersData[criteria] == criterias[criteria] &)]

Anyone has an idea of the best way to do that?

3 Answers 3

1

You can use boolean indexing with pandas.DataFrame.iloc and pandas.Series.isin combined.

criterias = {"First name": "Thomas", "Last name": "Shelby"}

usersData.loc[usersData[criterias.keys()].isin(criterias.values()).all(axis = 1),: ]

# Output :

 First name Last name    ID1    ID2 Description
0     Thomas    Shelby  TS123  T_SHE        Yeah
Sign up to request clarification or add additional context in comments.

Comments

0

eval() can be used:

import pandas as pd
df=pd.DataFrame(data={'first_name':['Thomas','Jack','John','Alice'],'last_name':['Shelby','Down','Doe','Lang'],
                      'ID1':['TS123','JD124','JD125','AL127']})

criterias = {"first_name": "Thomas", "last_name": "Shelby","ID1":"TS123"}

con=[]
for key, value in criterias.items():
    con.append("(df['{}']=='{}')".format(key,value))
    
condition=' & '.join(con)

print(condition)
'''
"(df['first_name']=='Thomas') & (df['last_name']=='Shelby') & (df['ID1']=='TS123')"
'''
final=df[eval(condition)]
print(final)

'''
      first_name last_name    ID1
0     Thomas     Shelby       TS123
'''

Can be developed according to the use case.

Comments

0

We can apply the filter conditions in a loop.

from copy import deepcopy
criteria = {"First name": "Thomas", "Last name": "Shelby"}
searchResult = deepcopy(usersData)
for c in criteria:
    searchResult = searchResult[searchResult[c] == criteria[c]]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.