#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. Хотя обе ваши идеи сработали, ваша вторая подводит меня еще ближе к тому, что мне нужно продолжить. Спасибо!