如何根据另一个变量中的连续值对变量应用函数

Posted

技术标签:

【中文标题】如何根据另一个变量中的连续值对变量应用函数【英文标题】:How to apply function on variable based on consecutive values in another variable 【发布时间】:2019-09-02 10:36:14 【问题描述】:

我有一个带有图像编号 (sliceno) 和 x 和 y 坐标(分别为 x 位置和 y 位置)的数据框。这些图像是随时间拍摄的,相同的切片编号表示在同一时间点记录的多个坐标。

我想将图像的坐标与之前的坐标进行比较。如果后续图像的 x 坐标为 +/-1 或等于前一个图像的 x 坐标,并且这种情况发生了两次,即有两个相同 sliceno 的记录满足坐标要求。 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

【问题讨论】:

我认为您想要的输出在这里并不完全清楚。你想退货什么?您的示例中的任何记录是否符合条件? @ATK7474 我想要代码:i) 比较连续的 sliceno,即将 sliceno x+1 与 sliceno 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',))

你绝对可以把它浓缩成一堆,但这是一个很好的起点。

【讨论】:

到目前为止这很好,谢谢。我可以使用 def 语句。抱歉,如果我的问题不清楚,但每个 sliceno 都有多行。所以我真的需要将每个与每个连续的 sliceno 进行比较。 请问如何扩展 def 语句以检查两个以内?添加似乎不起作用:row[axis + '_previous'] - 2 &lt;=row[axis + '_previous'] + 2 @sforbes 所以说真的,您不是只想比较每个“sliceno”值的下一行,而是要与共享该值的每一行进行比较?所以在这个例子中,你会想看到前三行都有一个在 1 以内的“y 位置”(因为它们都是 sliceno 6)? 我想比较所有的 sliceno,而不是相互比较,而是比较所有连续的 sliceno。所以例如所有 sliceno6s 到 sliceno7s。目前我正在研究构建一个数据框,其中包含每行感兴趣的两个切片的 x 位置和 y 位置,然后为每一行运行 def 注释。 我已经设法以我可以使用 def 函数的格式获取数据。您能否向我解释一下它是如何工作的,以便我可以对其进行编辑,使其包含 +2、-2 等?

以上是关于如何根据另一个变量中的连续值对变量应用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 R 中的另一个数据帧解码一个数据帧中变量的值?

如何根据另一个变量的值计算变量的平均值?

如何在变量中提取字典单键值对

我们如何根据节点js中的另一个对象数组值对对象数组进行排序

如何将变量从另一个函数传递到索引函数中的视图

如何根据数据库中的另一个变量存储不同自增的ID