Переиндексация фрейма данных Pandas с интерполированными значениями

#python #pandas #dataframe #numpy

#python #pandas #фрейм данных #numpy

Вопрос:

У меня есть фрейм данных pandas с индексом DatetimeIndex и столбцами «Порог», «Путь»:

                              Path  Threshold
2020-12-11 04:00:25.729  0.000104  -1.107422
2020-12-11 04:00:25.731  0.000387  -1.107422
2020-12-11 04:00:25.733  0.000899  -1.107422
2020-12-11 04:00:25.735  0.001561  -1.117676
2020-12-11 04:00:25.737  0.002272  -1.117676
...                           ...        ...
2020-12-11 04:01:03.063  9.085985  -1.209961
2020-12-11 04:01:03.065  9.085985  -1.209961
2020-12-11 04:01:03.067  9.085985  -1.209961
2020-12-11 04:01:03.069  9.085985  -1.199707
2020-12-11 04:01:03.071  9.085985  -1.199707
 

Теперь я хочу создать новый фрейм данных, который индексируется в линейно разнесенной версии «Пути», т. Е.

 >>> np.arange(df["Path"].min(), df["Path"].max(), 0.05)
array([1.040000e-04, 5.010400e-02, 1.001040e-01, 1.501040e-01,
       2.001040e-01, 2.501040e-01, ...
 

Значения из «Пути» являются монотонными (но не строго монотонными). В качестве столбца для этого нового фрейма данных я хочу установить соответствующие интерполированные значения из «Threshold», однако с помощью методов pandas interpolate и numpy interp мне не удалось этого добиться. Есть ли какой-нибудь способ сделать это?

Комментарии:

1. Если используется только образец данных, о которых идет речь, как ожидается, результат? Что происходит с дублированными значениями Path ?

2. @jezrael Для меня это не имеет большого значения, я думаю Path , было бы неплохо просто удалить любые дубликаты

Ответ №1:

Одна из идей заключается в использовании merge_asof :

 a = np.arange(df["Path"].min(), df["Path"].max(), 0.05)

df1 = pd.merge_asof(df.reset_index(), 
                    pd.DataFrame({'new':a}), 
                    left_on='Path', 
                    right_on='new', 
                    direction='nearest')
 

Еще одна идея с удалением дублированных и DataFrame.reindex :

 df2 = (df.drop_duplicates('Path')
         .reset_index()
         .set_index('Path')
         .reindex(a, method='nearest'))
 

Комментарии:

1. Хотя обе ваши идеи сработали, ваша вторая подводит меня еще ближе к тому, что мне нужно продолжить. Спасибо!