Вы можете создать массив несуществующих столбцов и создать новый с помощью assign
и словаря:
df = pd.DataFrame({'id': ['a1','a2', 'b1'],
'a': ['a1','a2', 'b1'],
'source': ['a1','a2', 'b1']})
print (df)
id a source
0 a1 a1 a1
1 a2 a2 a2
2 b1 b1 b1
db_fields = ("id", "email", "status", "source")
#get missing columns
diff = np.setdiff1d(np.array(db_fields), df.columns)
print (diff)
['email' 'status']
#get original columns not existed in db_fields
diff1 = np.setdiff1d(df.columns, np.array(db_fields)).tolist()
print (diff1)
['a']
#add missing columns with change order
d = dict.fromkeys(diff, np.nan)
df = df.assign(**d)[diff1 + list(db_fields)]
print (df)
a id email status source
0 a1 a1 NaN NaN a1
1 a2 a2 NaN NaN a2
2 b1 b1 NaN NaN b1
#if necessary first db_fields
df = df.assign(**d)[list(db_fields) + diff1]
print (df)
id email status source a
0 a1 NaN NaN a1 a1
1 a2 NaN NaN a2 a2
2 b1 NaN NaN b1 b1