интерполяция по pandas столбцам данных - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно сделать интерполяцию между 2 столбцами pandas.DataFrame, чтобы заполнить столбец между ними. Вот несколько строк моего data frame, столбец, который нужно заполнить, равен col2:

col1  col2  col3
2.35    1   2.37
2.47    1   2.49
2.51    1   2.53
2.57    1   2.58
2.54    1   2.57

Так что для интерполяции я хочу использовать numpy.interp(x,xp,fp), но не могу понять, как организовать свои данные так, чтобы я мог их использовать. Это потому, что интерполяция должна быть между col1 и col3 для каждой строки. Например, для первой строки мне нужно, чтобы она выглядела так:

xp=[1,3]
fp=[2.47,2.49]
x=2
y=numpy.interp(x,xp,fp)

и затем заполните первый ряд col2 с помощью y. И мне нужно делать это снова и снова для каждого ряда. Как?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Как написано, значения x равны c (если я не понимаю вашу проблему) со значениями 1 и 3. Вы хотите выполнить линейную интерполяцию между этими значениями и двумя меняющимися значениями y. Вы просто усредняете значения y, и это линейно-интерполированное значение. Не упускайте из виду простые / очевидные решения для чего-то фантастического (совет, который я стараюсь постоянно помнить).

df.col2 = df[["col1", "col3"]].mean(axis=1)

НАЧАТЬ РЕДАКТИРОВАТЬ

Решение Андре должно работать (сам не проверял) , но должен). Однако это требует итерации по каждой строке, что может быть медленным. Кроме того, существует простое математическое решение, которое позволяет вам работать с массивами, что должно быть быстрее.

Линейная интерполяция выполняется в общем виде:

y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)

С точки зрения фреймов данных / кода:

df.col2 = df.col1 + (x - xp[0]) * (df.col2 - df.col1) / (xp[1] - xp[0])

Я думаю, что был переведен правильно, но Формула выше имеет место. Просто внедрите его в свой код или l oop через каждую строку и вызовите функцию numpy .interp. В любом случае, с тобой все будет в порядке.

0 голосов
/ 17 марта 2020

Это позволит вам перебирать каждую строку, заменяя значение между двумя ячейками. Но интерполяция, похоже, не работает. У меня нет большого опыта с этим, поэтому я не мог найти легкое решение онлайн. Это единственная строка, которая не меняет значения. (Я не знаю, что делают хр или х, поэтому я их сохранил)

xp=[1,3]
x = 2
for rowNr in range(len(df.index)):
    fp=[df.iat[rowNr, 0], df.iat[rowNr, 2]]
    df.iat[rowNr, 1] = numpy.interp(x, xp, fp)
...