Pandas. Действия с частью столбца по условию. trying to be set on a copy of a slice from a DataFrame. Returning a view versus a copy

Датафрейм df_fin:

,DATE,DECDATE,HAE_RAW,HAN_RAW,HK2_RAW
0,2019:04:30:00:00,1556539260,7445.47,-5865.28,22330.2
1,2019:04:30:00:01,1556539320,7445.47,-5865.28,22330.2
2,2019:04:30:00:02,1556539380,7445.47,-5865.28,22330.2  
...  
1199518,2021:09:28:23:58,1632830340,-1053620.0,-3168580.0,23419.9
1199519,2021:09:28:23:59,1632830400,-1053490.0,-3168520.0,23418.3

Содержит отсчеты снятые с АЦП датчика. Столбцы:
DATE время отсчета
DECDATE время отсчета в секундах с начала эпохи
HAE_RAW,HAN_RAW,HK2_RAW отсчеты трех параметров снимаемых с датчика.

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

,start,end,x,y,t
0,2019:04:30:00:00,2021:05:24:23:59,0.0012324169,0.001267882,0.00032246
1,2021:05:25:00:00,2021:06:13:05:25,0.0,0.0,0.0
2,2021:06:13:05:26,2021:09:28:22:36,0.000287286,0.00030345,0.00032246

Каждая строка файла содержит начало и конец временного промежутка и коэффициенты применяемые в этот промежуток.
Чтобы домножить значения столбцов df_fin на коэффициенты делал так:

coef_df_file = pd.read_csv(conf_fl) #Читаем файл с коэффициентами
for row in coef_df_file.iterrows(): #Последовательно перебираем строки файла
        start, stop, x,y,t = row['start'],row['end'], row['x'],row['y'],row['t'] #Получаем начало, конец в промежутка и три коэффициента
        current_part_of_df_fin = df_fin.loc[df_fin['DATE'].between(start,stop)] #Выбираем нужную часть df_fin в промежутке
        current_part_of_df_fin['HAE'] = current_part_of_df_fin['HAE_RAW'] * x # Домножаем на коэффициенты
        current_part_of_df_fin['HAN'] = current_part_of_df_fin['HAN_RAW'] * y
        current_part_of_df_fin['HK2'] = current_part_of_df_fin['HK2_RAW'] * t  

Ошибка:

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

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  current_part_of_df_fin['HAE'] = current_part_of_df_fin['HAE_RAW'] * x

Почитал предлагаемую ссылку и здесь:A value is trying to be set on a copy of a slice from a DataFrame - не пойму как исправить, но понимания как адаптировать к своему случаю не появилось. Буду признателен за помощь.


Ответы (1 шт):

Автор решения: glukoff

Сделал так:

for index, row in coef_df_file.iterrows(): 
        start, decstart,stop, decstop,x,y,t = row['start'],row['decstart'],row['end'],row['decstop'], row['x'],row['y'],row['t']
        print(start,stop, x,y,t)
        condition = (df_fin['DECDATE'] >= int(decstart)) & (df_fin['DECDATE'] <= int(decstop))
        df_fin.loc[condition, 'HAE'] = df_fin['HAE_RAW'] * x
        df_fin.loc[condition, 'HAN'] = df_fin['HAN_RAW'] * y
        df_fin.loc[condition, 'HK2'] = df_fin['HK2_RAW'] * t  

Для удобства пришлось в файл коэффициентов ввести дату начала и конца интервала в секундах с начала эпохи (колонки row['decstart'], row['decstop']), хотя можно написать через timestamp, но мне было так удобнее. Здесь не создается лишняя копия датафрейма, при которой появляется ошибка. Работает довольно быстро. Может быть можно написать лучше (без цикла), было бы интересно взглянуть.

→ Ссылка