Как применить функцию к переменной на основе последовательных значений в другой переменной - PullRequest
5 голосов
/ 11 апреля 2019

У меня есть фрейм данных с номером изображения (sliceno) и координатами x и y (x-position и y-position соответственно).Эти изображения сняты с течением времени, и один и тот же номер среза указывает на несколько координат, записанных в один и тот же момент времени.

Я хочу сравнить координаты изображений с теми, которые были раньше.Если координата x последующего изображения равна +/- 1 или равна координате x предыдущего изображения, и это происходит дважды, то есть есть две записи одного и того же слайса, которые удовлетворяют требованиям координат.То же самое для координат y.

import pandas as pd

print(dataframe)
x-position  y-position  radius (pixels)  r-squared of radius fitting sliceno
0          220         220           19.975                        0.987       6
1          627         220           20.062                        0.981       6
2          620         220           20.060                        0.981       6
3          220         220           19.975                        0.987       7
4          628         220           20.055                        0.980       7

1 Ответ

1 голос
/ 16 апреля 2019

Я попытался разобрать это, чтобы прояснить, что происходит, но это должно дать вам два новых столбца 'x' и 'y', которые содержат логическое значение того, были ли выполнены ваши критерии.

import pandas as pd

df = pd.DataFrame(
    columns=['x-position', 'y-position', 'radius', 'r-squared', 'sliceno'],
    index=[i for i in range(5)],
    data=[
        [220, 220, 19.975, 0.987, 6],
        [627, 220, 20.062, 0.981, 6],
        [620, 220, 20.060, 0.981, 6],
        [220, 220, 19.975, 0.987, 7],
        [628, 220, 20.055, 0.980, 7],
    ]
)
df['x_previous'] = df['x-position'].shift()
df['y_previous'] = df['y-position'].shift()
df['slice_previous'] = df['sliceno'].shift()

def check_within_one(row, axis):
    within_1 = (True if row[axis + '_previous'] - 1 <=
                        row[axis + '-position'] <=
                        row[axis + '_previous'] + 1 and
                        row['sliceno'] == row['slice_previous']
                else False)

    return within_1

df['x'] = df.apply(check_within_one, axis=1, args=('x',))
df['y'] = df.apply(check_within_one, axis=1, args=('y',))

Вы можете определенно сократить это, но это хорошая отправная точка.

...