Один из способов будет следующим: сначала в вашем df1
вы создадите столбец bool
, если ваше условие выполнено:
df1['bool'] = df1.apply(lambda row: True if row['contact_person'] in df2['parents_list'][df2['student'] == row['student']].iloc[0] else False,1)
Тогда вы можете merge
тот, где условие выполненоdf_yes
и append
там, где оно не выполнено df_no
:
df_yes = df1[df1['bool'] == True].\
merge(df2, on='student', how = 'left').drop('bool',1)
df_no = df1[df1['bool'] == False].\
append(df2[df2['student'].isin(df1['student'][df1['bool'] == False])]).drop('bool',1)
Наконец просто append
оба:
list_ordered_col = ['id_df1', 'id_df2', 'student', 'contact_person', 'parents_list']
df_output = df_yes.append(df_no)[list_ordered_col ].\
reset_index(drop=True)
Примечание: это работало с вашим предыдущим вводомдля parent_list (когда это были a, b, c ...)
РЕДАКТИРОВАТЬ: заменить df1['bool']=...
на:
def parantes_in_parentList (row, df_list):
df_parent_list = df_list['parents_list'][df_list['student'] == row['student']]
if not df_parent_list.empty:
if row['contact_person'] in df_parent_list.iloc[0]:
return True
# return False in all the other case
return False
df1['bool'] = df1.apply(parantes_in_parentList , args=([df2]),axis=1)