Вы можете использовать str[0]
для проверки первого символа, затем cumsum
для пометки блоков:
df['text'].groupby(df['text'].str[0].eq('[').cumsum()).agg(' '.join)
Вывод:
text
1 [aaa] sss
2 [bbb] mmm fff ppp
3 [iii] rrr qqq
4 [ggg] kkk
Name: text, dtype: object