Если длина списка всегда такая же, как у числа значений, соответствующих условию, используйте:
df['D'] = df['B']
df.loc[df.C > 0, 'D'] = List1
print (df)
A B C D
0 Daisy 5 -1 5
1 Sunflower 3 5 1
2 Tulip 15 5 4
3 Orchid 8 6 6
4 Lotus 23 -1 23
5 Poppy 9 6 15
6 Lily 40 -1 40
Или:
df.loc[df.C > 0, 'D'] = List1
df['D'] = df['D'].fillna(df['B'])
print (df)
A B C D
0 Daisy 5 -1 5.0
1 Sunflower 3 5 1.0
2 Tulip 15 5 4.0
3 Orchid 8 6 6.0
4 Lotus 23 -1 23.0
5 Poppy 9 6 15.0
6 Lily 40 -1 40.0
Общее решение с itertools.zip_longest
также работает, если длина не соответствует длине истин в маске:
from itertools import zip_longest
List1=[1, 4, 6,15,3]
m = df.C > 0
lens = m.sum()
df['D'] = df['B']
df.loc[m, 'D'] = [x for x, y in zip_longest(List1[:lens], range(lens), fillvalue=np.nan)]
print (df)
A B C D
0 Daisy 5 -1 5
1 Sunflower 3 5 1
2 Tulip 15 5 4
3 Orchid 8 6 6
4 Lotus 23 -1 23
5 Poppy 9 6 15
6 Lily 40 -1 40
from itertools import zip_longest
List1=[1, 4]
m = df.C > 0
lens = m.sum()
df['D'] = df['B']
df.loc[m, 'D'] = [x for x, y in zip_longest(List1[:lens], range(lens), fillvalue=np.nan)]
print (df)
A B C D
0 Daisy 5 -1 5.0
1 Sunflower 3 5 1.0
2 Tulip 15 5 4.0
3 Orchid 8 6 NaN
4 Lotus 23 -1 23.0
5 Poppy 9 6 NaN
6 Lily 40 -1 40.0