Как перемешать строки в CSV файле — 4 способа рандомизации

Марина Козлова · · 6 мин чтения

Зачем перемешивать строки в CSV

Представьте: вы подготовили базу для холодных звонков. Номера отсортированы по дате добавления — первые 10 тысяч из одного региона, следующие 10 тысяч из другого. Если обзванивать по порядку, первый менеджер получит только Москву, второй — только Питер. Несправедливо и неэффективно.

Или другой сценарий: вы проводите A/B-тест рассылки. Если первая половина базы получит вариант A, а вторая — вариант B, результаты будут искажены: вдруг первая половина — это старые контакты, а вторая — свежие?

Перемешивание (shuffle) нужно, чтобы:

Excel и функция RAND()

Подходит для: небольших файлов (до 100 тысяч строк)
Время: 5 минут
Сложность: низкая

Excel умеет генерировать случайные числа — на этом и построим перемешивание.

Алгоритм:

  1. Откройте CSV в Excel
  2. Добавьте вспомогательный столбец справа (например, столбец B)
  3. В первой ячейке столбца введите формулу =RAND()
  4. Протащите формулу вниз на все строки — каждая строка получит случайное число от 0 до 1
  5. Выделите оба столбца (данные + случайные числа)
  6. Перейдите в Данные → Сортировка
  7. Отсортируйте по столбцу со случайными числами (по возрастанию или убыванию — неважно)
  8. Удалите вспомогательный столбец
  9. Сохраните результат

Ограничения:

Для разовой задачи с маленьким файлом — вполне рабочий вариант.

Командная строка — shuf и sort -R

Подходит для: средних и больших файлов
Время: несколько секунд
Сложность: средняя (нужны базовые навыки терминала)

В Linux и macOS есть утилита shuf, которая перемешивает строки:

shuf phones.csv > phones_shuffled.csv

Всё. Одна команда — и файл перемешан.

Если shuf недоступна (например, на старых версиях macOS), можно использовать sort с флагом -R (random):

sort -R phones.csv > phones_shuffled.csv

Ограничения:

Для технически подкованных пользователей — быстрый и надёжный способ.

Python и random.shuffle()

Подходит для: автоматизации и больших файлов
Время: 10 минут на написание скрипта
Сложность: средняя (нужно знать Python)

import random

with open('phones.csv', 'r') as f:
    lines = f.readlines()

# Перемешиваем список строк
random.shuffle(lines)

with open('phones_shuffled.csv', 'w') as f:
    f.writelines(lines)

print(f'Перемешано {len(lines)} строк')

Этот скрипт загружает весь файл в память, перемешивает и записывает обратно. Работает быстро на файлах до нескольких миллионов строк.

Для файлов больше RAM: используйте командную строку (shuf) или Basalt — они работают потоково и не упираются в память.

Важно: Python использует алгоритм Fisher-Yates для random.shuffle() — это гарантирует равномерное распределение. Каждая перестановка имеет одинаковую вероятность.

Ограничения:

Basalt — перемешивание за 30 секунд

Подходит для: любых размеров
Время: 30 секунд
Сложность: нулевая

Basalt делает перемешивание максимально простым — без кода, без командной строки, без Excel-формул.

Инструкция:

  1. Запустите Basalt, выберите функцию «Перемешать»
  2. Перетащите CSV-файл в окно (или выберите через кнопку)
  3. Укажите, куда сохранить результат
  4. Нажмите «Запустить»

Программа автоматически:

Что такое Fisher-Yates?

Это классический алгоритм случайного перемешивания. Работает так:

  1. Берём последний элемент списка
  2. Меняем его местами со случайным элементом (включая себя)
  3. Переходим к предпоследнему, повторяем
  4. Продолжаем, пока не дойдём до начала

Почему Fisher-Yates? Потому что он гарантирует равномерное распределение: каждая возможная перестановка имеет одинаковую вероятность. Более простые алгоритмы (например, «поменять каждый элемент с случайным») могут давать предвзятые результаты.

Basalt использует Fisher-Yates — вы получаете математически корректное перемешивание.

Как проверить качество перемешивания

Не все методы перемешивания одинаково хороши. Вот как проверить, что ваш файл действительно случаен:

Визуальная проверка

Откройте первые 50 строк исходного и перемешанного файла. Если перемешивание сработало, порядок должен радикально отличаться. Если видите, что большие блоки остались на месте — что-то пошло не так.

Проверка на паттерны

Если исходный файл был отсортирован (например, по региону или дате), проверьте, что после перемешивания эти паттерны разрушены:

Статистический тест (для параноиков)

Можно написать скрипт, который проверяет, что каждый элемент переместился. Если 90%+ элементов остались на своих местах — перемешивание фиктивное.

original = open('phones.csv').readlines()
shuffled = open('phones_shuffled.csv').readlines()

same_position = sum(1 for i in range(len(original)) if original[i] == shuffled[i])
percentage = (same_position / len(original)) * 100

print(f'На своих местах: {percentage:.1f}%')
# Должно быть близко к 0% (для больших файлов может быть 0.01—0.1%)

Если больше 5% элементов остались на местах — перемешивание недостаточно случайное.

Практические советы

1. Не перемешивайте файлы с заголовками

Если в первой строке CSV находится заголовок (phone,name,region), а вы перемешаете весь файл, заголовок окажется где-то в середине.

Решение:

2. Проверьте, что количество строк не изменилось

После перемешивания подсчитайте строки в исходном и результирующем файле:

wc -l phones.csv phones_shuffled.csv

Числа должны совпадать. Если результат короче — что-то потерялось.

3. Сохраняйте оригинал

Перемешивание необратимо. Если позже выяснится, что исходный порядок был важен (например, там была хронология), восстановить его будет невозможно.

Basalt всегда создаёт новый файл, не трогая оригинал. Но если вы пишете свой скрипт — не забудьте сделать то же самое.

4. Используйте seed для воспроизводимости

Если вам нужно, чтобы перемешивание было случайным, но воспроизводимым (например, для отладки), используйте seed:

import random

random.seed(42)  # Любое число
random.shuffle(lines)

Теперь при каждом запуске с seed(42) вы получите одинаковое перемешивание. Для production убирайте seed — нужна настоящая случайность.

Когда перемешивание не нужно

Не всегда случайный порядок — это хорошо:

Перемешивайте, только если есть причина. Случайность ради случайности — пустая трата времени.

Истинная случайность — проще, чем кажется

Перемешивание строк в CSV — базовая операция, которая решает реальные задачи: справедливое распределение нагрузки, честные A/B-тесты, разрушение нежелательных паттернов.

Главное:

Все современные инструменты используют Fisher-Yates или его аналоги — это гарантирует математически корректное перемешивание.

Не перемешивайте вручную (сортируя строки наугад) — человек плохо умеет генерировать случайность. Доверьте это компьютеру.