Когда я использовал ваш код в приведенном примере, значение, похоже, корректно меняется
import pandas as pd
import numpy as np
# Create example dataframe
data = pd.DataFrame(np.arange(0,100,10), columns=['id'])
data.loc[3, 'source'] = 'foo'
# Change value
data.loc[(data.id.isin([10,20,30,40])) & (data.source.isnull()), 'id'] = 50
После этого столбец id имеет значения [0, 50, 50, 30, 50, 50, 60, 70, 80, 90]