Use map
All the necessary logic:
def update_type(t1, t2, dropna=False): return t1.map(t2).dropna() if dropna else t1.map(t2).fillna(t1)
Denote 'ItemType2' index Dataframe2
update_type(Dataframe1.ItemType1, Dataframe2.set_index('ItemType2').newType) 0 Tomato 1 Potato 2 Potato 3 greenCauliflower 4 yellowCauliflower 5 Squash 6 Onions 7 Onions 8 Onions 9 yellowCabbage 10 GreenCabbage Name: ItemType1, dtype: object
update_type(Dataframe1.ItemType1, Dataframe2.set_index('ItemType2').newType, dropna=True) 0 Tomato 1 Potato 2 Potato 3 greenCauliflower 4 yellowCauliflower 5 Squash 6 Onions 7 Onions 8 Onions Name: ItemType1, dtype: object
Verify
updated = update_type(Dataframe1.ItemType1, Dataframe2.set_index('ItemType2').newType) pd.concat([Dataframe1, updated], axis=1, keys=['old', 'new'])

Timing
def root(Dataframe1, Dataframe2): return Dataframe1['ItemType1'].replace(Dataframe2.set_index('ItemType2')['newType'].dropna()) def piRSquared(Dataframe1, Dataframe2): t1 = Dataframe1.ItemType1 t2 = Dataframe2.set_index('ItemType2').newType return update_type(t1, t2)

source share