Панды - новая строка для каждого дня в диапазоне дат - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть Pandas df с одним столбцом (Reservation_Dt_Start), представляющим начало диапазона дат, и другим (Reservation_Dt_End), представляющим конец диапазона дат.

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

См. Два рисунка ниже для примера ввода и желаемого выхода.

InputOutput

Фрагмент кода ниже работает !!Однако для каждых 250 строк в таблице ввода требуется 1 секунда для запуска.Учитывая, что моя входная таблица имеет размер 120 000 000 строк, выполнение этого кода займет около недели.

pd.concat([pd.DataFrame({'Book_Dt': row.Book_Dt,
                         'Day_Of_Reservation': pd.date_range(row.Reservation_Dt_Start, row.Reservation_Dt_End),
                         'Pickup': row.Pickup,
                         'Dropoff' : row.Dropoff,
                         'Price': row.Price}, 

                          columns=['Book_Dt','Day_Of_Reservation', 'Pickup', 'Dropoff' , 'Price']) 
                          for i, row in df.iterrows()], ignore_index=True)

Должен быть более быстрый способ сделать это.Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

pd.concat в цикле с большим набором данных становится довольно медленным, так как он будет каждый раз делать копию кадра и возвращать новый кадр данных.Вы пытаетесь сделать это 120 миллионов раз.Я бы попытался поработать с этими данными как простой список кортежей, а затем преобразовать их в конец кадра данных.

Например,

Учитывая список list = []

Для каждогострока в кадре данных:

  • получить список диапазона дат (можно использовать pd.date_range здесь еще), сохранить в переменной dates, которая представляет собой список дат

  • для каждой даты в диапазоне дат, добавьте кортеж в список list.append((row.Book_Dt, dates[i], row.Pickup, row.Dropoff, row.Price))

Наконец, вы можете преобразовать список кортежей в фрейм данных:

df = pd.DataFrame(list, columns = ['Book_Dt', 'Day_Of_Reservation', 'Pickup', 'Dropoff', 'Price'])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...