Интерполяция нескольких столбцов в кадре данных

У меня есть фрейм данных с несколькими столбцами

df = pd.DataFrame({
'Date': [1930, 1931, 1932, 1933,1934],
'File1': [np.nan, 72, 58, 280, 958],
'File2': [22, np.nan, np.nan, np.nan, 13],
'File3': [np.nan, np.nan, np.nan, 18, 137],
'File4': [np.nan, 552, 1377, 280, np.nan],
'File5': [45, 1252, np.nan, 1841, np.nan],
}) 

Я хочу выполнить интерполяцию для всего фрейма данных (например, используя FillMean). Однако файлы имеют разные даты начала и окончания. Поэтому мне нужно сказать интерполировать (используя FillMean ) между первым значением и последним значением этого файла (он не должен интерполировать до даты начала (первое значение в файле) или после даты окончания (последнее значение в файле)

Например для:

  • файл 1 интерполяция не должна выполняться, так как нет пропущенных значений после начальной даты.
  • В файле 2 должна быть интерполяция, так как между датой начала и датой окончания есть пустое значение
    И так далее…

ожидаемый результат

   Date  File1  File2  File3   File4   File5
0  1930    NaN  22.00    NaN   280.0    45.0
1  1931   72.0  19.75    NaN   552.0  1252.0
2  1932   58.0  17.50    NaN  1377.0  1546.5
3  1933  280.0  15.25   18.0   280.0  1841.0
4  1934  958.0  13.00  137.0     NaN     NaN

person Tamarie    schedule 04.03.2020    source источник


Ответы (1)


Используйте DataFrame.interpolate с параметром limit_are='inside':

df = df.interpolate(limit_are='inside').mask(df.bfill().isna())
print (df)
   Date  File1  File2  File3   File4   File5
0  1930    NaN  22.00    NaN     NaN    45.0
1  1931   72.0  19.75    NaN   552.0  1252.0
2  1932   58.0  17.50    NaN  1377.0  1546.5
3  1933  280.0  15.25   18.0   280.0  1841.0
4  1934  958.0  13.00  137.0     NaN     NaN
person jezrael    schedule 04.03.2020
comment
На первый взгляд это сработало, но когда я проверил сейчас, просто чтобы подтвердить, кажется, что интерполяция работает для начального периода (она начинает интерполяцию в нужное время), но в конце она выходит за пределы даты окончания. Например, файл 4 и 5 должен заканчиваться на 1933 год. - person Tamarie; 04.03.2020
comment
@Tamarie - Можете ли вы добавить ожидаемый выходной DataFrame для проверки всех столбцов? - person jezrael; 04.03.2020
comment
добавлен ожидаемый результат в конце вопроса - person Tamarie; 04.03.2020
comment
@Tamarie - спасибо, кажется, (limit_are='inside' добавил значения в конец, поэтому добавил DataFrame.mask для замены значений на отсутствующие за последние NaNs - person jezrael; 04.03.2020