Таки это будет новый df, я бы так и обозначил это использованием нового val
И думаю, мастерство for comprehensions тут пригодилось бы: создать нужные функции, которые возвращали бы Option[DataFrame] и:
for {df <- Some(dfRaw)
dfNew <- newDF(df)
dfChanged <- changeDF(df, dfNew)
} yield dfChanged
Воспринимайте как псевдокод, я же только в процедурном программировании понимаю, в функциональном ниоч))