Возникла проблема с обновлением значений даты и времени в столбце, объединяющем данные из других информационных фреймов.Первый df включает в себя данные автомобиля компании по прокату автомобилей:
df_cars = pd.DataFrame([['1708092730', 'MERC', 'GLK270', 'PLT01', '', ''],
['T170900224', 'MERC', 'C200', 'PLT02', '', ''],
['1708092733', 'BMW', 'Χ3', 'PLT03', '', ''],
['T170902781', 'BMW', 'X6', 'PLT04', '', ''],
['T171002176', 'VW', 'PASSAT', 'PLT05', '', ''],
['1708090817', 'FORD', 'MUSTANG', 'PLT06', '', '']],
columns=['RefNo', 'Brand', 'Model', 'Plate', 'Driver', 'Date'])
Второй df состоит из записей исходящих гаражей:
df_out = pd.DataFrame([['1708092733', 'John', '2018-1-2', 'MC', 250],
['T170900224', 'Phil', '2018-1-15', 'AMEX', 400],
['T170902781', 'Ann', '2018-1-22', 'VI', 400],
['1708092730', 'Ann', '2018-1-28', 'AMEX', 200],
['1708092733', 'Jeff', '2018-2-1', 'VI', 200]],
columns=['RefNo', 'Driver', 'Date', 'Payment', 'Deposit'])
, а третий df включает записи входящих гаражей:
df_in = pd.DataFrame([['1708092733', '2018-1-18', 165],
['T170902781', '2018-2-12', 600],
['1708092730', '2018-2-15', 150]],
columns=['RefNo', 'Date', 'Ammount'])
RefNo - это уникальный штрих-код на ключах от машины.Я пытаюсь обновить столбцы df_cars:
- 'Водитель', указав имя последнего водителя, который арендовал автомобиль, на случай, если он выйдет из гаража и
- 'Дата 'с последней датой изменения статуса автомобиля (' из гаража 'или' в гараже ')
Следующий код обновления работает нормально с небольшим количеством строк
df_OutIn = pd.concat([df_out, df_in]) # concatenate Garage out & in entries
df_OutIn['Date'] = pd.to_datetime(df_OutIn.Date) # OutIn df Date column to datetile format
df_OutIn = df_OutIn.sort_values(by='Date') # sort OutIn df by Date
df_OutIn = df_OutIn.drop_duplicates(['RefNo'], keep='last') # remove duplicates and keep last update per car
df_tmp = df_cars[['RefNo', 'Driver']].set_index('RefNo') # Update 'Driver' in df_cars
df_tmp.update(df_OutIn.set_index('RefNo'))
df_cars['Driver'] = df_tmp.values
df_tmp = df_cars[['RefNo', 'Date']].set_index('RefNo') # Update 'Date' in df_cars
df_tmp.update(df_OutIn.set_index('RefNo'))
df_cars['Date'] = df_tmp.values
df_cars['Date'] = pd.to_datetime(df_cars.Date)
Ожидается, что df_cars будет обновлен до
RefNo Brand Model Plate Driver Date
0 1708092730 MERC GLK270 PLT01 2018-02-15
1 T170900224 MERC C200 PLT02 Phil 2018-01-15
2 1708092733 BMW Χ3 PLT03 Jeff 2018-02-01
3 T170902781 BMW X6 PLT04 2018-02-12
4 T171002176 VW PASSAT PLT05 NaT
5 1708090817 FORD MUSTANG PLT06 NaT
Когда весь набор данных (25-30k записей) обрабатывается, я получаю предупреждение
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
Есть ли предложения по улучшению этой части кода?Заранее спасибо!