К сожалению, функция pandas 'barh
не позволяет нам выбирать разные цвета для каждой полосы. Но так как это похоже на случай , я бы предпочел , а не использовать функцию построения панд, но вместо этого напрямую использовать функцию matplotlib.
В этом контексте естьмножество способов добиться желаемого результата.Вот один из вариантов:
fig, ax = plt.subplots()
c = ['C2' if i in df2.index else 'C1' for i in df1.index]
ax.barh(y=df1.index,width=df1.col1,color=c)
ax.grid(False)

@ Ответ GlobalTraveler заставил меня задуматься о другом решении
df3 = df1.loc[df1.index.difference(df2.index)].append(df2, sort=False).sort_index()
df3.plot(kind='barh', stacked=True, grid=False)
Первая строка создает новый фрейм данных, который имеет следующее содержимое:
col1 col2
index
1 5.0 NaN
2 8.0 NaN
3 NaN 6.0
4 4.0 NaN
5 NaN 2.0
При построении этого фрейма данных получается желаемый результат.