Missing data and duplicate data are different problems. A missing amount can mean that a payment hasn't arrived. A repeated customer id can be valid because a customer placed several orders. Decide which fields define a duplicate before calling dropDuplicates.
na.fill replaces missing values in selected fields. A dictionary makes the scope explicit, such as replacing only missing amounts with zero. na.drop(subset=...) removes rows missing one of the required fields and leaves other columns alone. Neither method repairs an invalid foreign key. distinct compares all selected columns; dropDuplicates can use a smaller key. When several rows share that key but have different attributes, an unspecified surviving row is not a business rule. A later window lesson gives you a deterministic way to choose the latest one.