#python #dataframe #variables #iteration
#python #фрейм данных #переменные #итерация
Вопрос:
У меня есть фрейм данных с номером изображения (sliceno) и координатами x и y (x-позиция и y-позиция соответственно). Эти изображения снимаются с течением времени, и один и тот же номер фрагмента указывает на несколько координат, записанных в один и тот же момент времени.
Я хочу сравнить координаты изображений с предыдущими. Если координата 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. Я не думаю, что здесь совершенно ясно, каков ваш желаемый результат. Что вы хотите вернуть? Будет ли какая-либо из записей в вашем примере соответствовать критериям?
2. @ATK7474 Я хотел бы, чтобы код: i) сравнивал последовательные срезы, т. Е. Сравнивал срез x 1 с срезом x; и ii) применял функцию, чтобы определить, являются ли x.position и y.positions для соответствующего среза /-1 x.position или y.position для предыдущего среза.
Ответ №1:
Я попытался разбить это, чтобы прояснить, что происходит, но это должно дать вам два новых столбца ‘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',))
Вы определенно можете сжать это в кучу, но это хорошая отправная точка.
Комментарии:
1. Пока это здорово, спасибо. Я могу использовать оператор def . Извините, если это не было ясно в моем вопросе, но для каждого среза есть несколько строк. Так что на самом деле мне нужно, чтобы каждый сравнивался с каждым последующим sliceno.
2. Как бы вы расширили оператор def для проверки в пределах двух, пожалуйста? Похоже, не работает, добавляя:
row[axis '_previous'] - 2 <=
иrow[axis '_previous'] 2
3. @sforbes Итак, на самом деле вы хотите сравнивать не только со следующей строкой для каждого значения ‘sliceno’, но и с каждой строкой, которая разделяет это значение? Итак, в этом примере вы хотели бы видеть, что все первые три строки имеют «y-позицию» в пределах 1 друг от друга (поскольку все они имеют срез 6)?
4. Я хочу сравнить все срезы не друг с другом, а со всеми последовательными срезами. Так, например, все sliceno6s к sliceno7s. На данный момент я изучаю создание фрейма данных, который содержит x-позицию и y-позицию для обоих интересующих срезов в строке, затем запустите комментарий def для каждой строки.
5. Мне удалось получить данные в формате, который я могу использовать с помощью функции def. Не могли бы вы объяснить, как это работает для меня, пожалуйста, чтобы я мог отредактировать его так, чтобы он включал 2, -2 и т.д.?