I have two dataframes in Pandas. What I want achieve is, grab every 'Name' from DF1 and get the corresponding 'City' and 'State' present in DF2.
For example, 'Dwight' from DF1 should return corresponding values 'Miami' and 'Florida' from DF2.
DF1
         Name     Age  Student
0        Dwight   20   Yes
1        Michael  30   No
2        Pam      55   No
.  .        .    .
70000    Jim      27   Yes
DF1 has approx 70,000 rows with 3 columns
Second Dataframe, DF2 has approx 320,000 rows.
         Name     City       State
0        Dwight   Miami      Florida
1        Michael  Scranton   Pennsylvania
2        Pam      Austin     Texas
.  .        .    .           .
325082    Jim      Scranton   Pennsylvania
Currently I have two functions, which return the values of 'City' and 'State' using a filter.
def read_city(id):
    filt = (df2['Name'] == id)
    if filt.any():
        field = (df2[filt]['City'].values[0])
    else:
        field = ""
    return field
def read_state(id):
    filt = (df2['Name'] == id)
    if filt.any():
        field = (df2[filt]['State'].values[0])
    else:
        field = ""
    return field
I am using the apply function to process all the values.
df['city_list'] = df['Name'].apply(read_city)
df['State_list'] = df['Name'].apply(read_state)
The result takes a long time to compute in the above way. It roughly takes me around 18 minutes to get back the df['city_list'] and df['State_list'].
Is there a faster to compute this ? Since I am completely new to pandas, I would like to know if there is a efficient way to compute this ?
 
     
    