Скажем, у меня есть три столбца
1,2,3 со значениями -5, 5, 15
Мне нужно найти, где между столбцами находится 0, и сделать его новым столбцом.
Здесь ответ будет 1,5 (на полпути между столбцами 1 и 2).
Как выполнить линейную интерполяцию в Python, чтобы сделать это для многих строк?
Необходимо включить все три столбца, чтобы получить ответ типа 2,2.
Если больше 3, можно экстраполировать или просто поставить 3 или нет.
Спасибо!
Поправьте меня, если я ошибаюсь, но линейная интерполяция работает только с двумя точками, так как же вы ожидаете, что она будет включать три? Тем не менее, вы получите результат, подобный 2,2, если точка пересечения с x находится между двумя точками. Кроме того, является ли это интерполяцией, если вы находите точку пересечения с x? Я думал, что интерполяция означает, что точки известны заранее, а не рассчитываются.
Пожалуйста, предоставьте пример фрейма данных и желаемый результат. Советы можно найти в разделе Как сделать хорошие воспроизводимые примеры панд
Из приведенного выше кода не очень понятно, как вы хотите обобщить код, но вот мое решение:
row = [-5, 5, 15]
for idx, val in enumerate(row):
if idx == len(row) - 1:
print("No change of sign.")
break
if row[idx] < 0 and row[idx + 1] > 0:
print(f"The change of sign occurs in column {idx+1+.5}.")
break
# > The change of sign occurs in column 1.5.
Вы не используете val
в цикле, поэтому лучше использовать диапазон: for idx in range(len(row)-1)
. А затем вместо idx == len(row) - 1
поставьте в цикле else
: else: print("No change of sign.")
. (Примечание на полях: мне нравится оставлять комментарий, еще: # без перерыва, чтобы было понятно.)
Вы можете использовать numpy.interp для каждой строки. Если цель находится за пределами границ, вы получите ближайшее значение x
.
Пример:
df = pd.DataFrame([[-5, 5, 15], [-5, -2, 6],[1, 2, 3], [-3, -2, -1]],
columns=[1,2,3])
df['x_at_0'] = [np.interp(0, xp, df.columns) for xp in df.to_numpy()]
Выход:
1 2 3 x_at_0
0 -5 5 15 1.50
1 -5 -2 6 2.25
2 1 2 3 1.00
3 -3 -2 -1 3.00
Что делать, если три значения равны -5, 5, -5… или даже 1,1,1?