касаемо вашего кода:
это, я думаю, лучше сразу в цикле собирать для каждого item, а то Вы запускаете доп цикл для доп. обработки
"\n".join(["|".join(i) for i in unically_data])
threading нужно ещё правильно использовать чтобы ускорить работу)
попробуйте использовать библиотеку numpy и выполнять преобразования с помощью её функций, она под это заточена
если думать про алгоритм, то для меня он такой (судя по коду и примерам):
1. найти строки, где item[0] встречается впервые
2. собрать из них результирующий массив данных