Сначала я бы pivot
, что значительно упростило поиск, а затем настроил ваш начальный DataFrame.
f = (df.pivot_table(index=['start_timestamp_milli', 'end_timestamp_milli'],
columns='name', values='rating', aggfunc='any', fill_value=0).astype(int))
Теперь, чтобы найти комбинации меток времени:
cols = ['Sadness', 'Happiness', 'Anger', 'Surprise', 'Stress']
appd = pd.Series(np.where(f[cols].any(1), 0, 1), index=f.index)
res = pd.concat([df, appd.rename('rating').reset_index().assign(name='Neutral')])
end_timestamp_milli name rating start_timestamp_milli
1 1555414723279 Valence 2 1555414708025
2 1555414723279 Arousal 6 1555414708025
3 1555414723279 Dominance 2 1555414708025
4 1555414723279 Sadness 1 1555414708025
5 1555414723279 Happiness 0 1555414708025
6 1555414723279 Anger 0 1555414708025
7 1555414723279 Surprise 0 1555414708025
8 1555414723279 Stress 0 1555414708025
9 1555414831795 Valence 3 1555414813304
10 1555414831795 Arousal 5 1555414813304
11 1555414831795 Dominance 2 1555414813304
12 1555414831795 Sadness 0 1555414813304
13 1555414831795 Happiness 0 1555414813304
14 1555414831795 Anger 0 1555414813304
15 1555414723279 Surprise 0 1555414708025
16 1555414723279 Stress 0 1555414708025
17 1555414931382 Valence 1 1555414921819
18 1555414931382 Arousal 7 1555414921819
19 1555414931382 Dominance 2 1555414921819
20 1555414931382 Sadness 1 1555414921819
21 1555414931382 Happiness 0 1555414921819
22 1555414931382 Anger 1 1555414921819
23 1555414723279 Surprise 0 1555414708025
24 1555414723279 Stress 1 1555414708025
0 1555414723279 Neutral 0 1555414708025
1 1555414831795 Neutral 1 1555414813304
2 1555414931382 Neutral 0 1555414921819
Это добавит их в конец кадра, вам нужно будет отсортировать, если вы хотите, чтобы они периодически помещались.