Я не уверен, что вам все еще нужны списки после операции.
df = pd.DataFrame({'pn': [[2107788451,2107788451,2107788451], [5126508976,5124430261]], 'pp': [[True,True,False], [True,False]], 'city': ['sa', 'a'], 'zip': [71, 78]})
df = pd.concat([df['pn'].explode(), df['pp'].explode()], axis=1).query('pp == True').merge(df[['city', 'zip']], left_index=True, right_index=True)
Если $
выдает ошибку, сделать это в 2 строки
ndf = pd.concat([df['pn'].explode(), df['pp'].explode()], axis=1)
df = ndf[ndf['pp'].eq(True)].merge(df[['city', 'zip']], left_index=True, right_index=True)`
pn pp city zip
0 2107788451 True sa 71
0 2107788451 True sa 71
1 5126508976 True a 78
df = df.drop_duplicates(['pn'])
pn pp city zip
0 2107788451 True sa 71
1 5126508976 True a 78