Python 数据帧减去横截面

Python 数据帧减去横截面,python,pandas,Python,Pandas,我有一个熊猫数据框,其中包含来自3D测量的数据(大约27k行)。我已经创建了一个由3个坐标列(x,y,z)组成的多索引。数据如下所示(沿y方向的多个xz平面): 以下是一个例子: 在下一步中,我想从每隔一个xz平面上减去横截面/切片在y=y0处的值,以规范化我的数据。目前,我通过在每一行上循环来实现这一点: for row in data.itertuples(): ind = row[0] value = row[1] ref = data["Analog 1"].ix

我有一个熊猫数据框,其中包含来自3D测量的数据(大约27k行)。我已经创建了一个由3个坐标列(x,y,z)组成的多索引。数据如下所示(沿y方向的多个xz平面):

以下是一个例子:

在下一步中,我想从每隔一个xz平面上减去横截面/切片在
y=y0
处的值,以规范化我的数据。目前,我通过在每一行上循环来实现这一点:

for row in data.itertuples():
    ind = row[0]
    value = row[1]
    ref = data["Analog 1"].ix[(y0, ind[1], ind[2])]
    data["Analog 1"].ix[ind] = value - ref

有更优雅的方法吗?

我更容易重置索引,将索引值恢复为列,然后调用从感兴趣的行中减去所有行:

In [65]:
df = df.reset_index()
df.sub(df[df['Position Y'] == -27.0].iloc[0], axis=1)

Out[65]:
   Position Y  Position X  Position Z  Analog 1
0         0.0         0.0         0.0      0.00
1         0.5         0.0         0.0      0.00
2         1.0         0.0         0.0      0.00
3         1.5         0.0         0.0      0.00
4         2.0         0.0         0.0     -0.02
这里请注意,过滤
df[df['Position Y']==-27.0]
返回一个
DataFrame
,因此如果您尝试减去它,它只会为所有其他行提供
NaN
,因此通过使用
iloc[0]
索引第一行也是唯一一行,它将返回一个
系列
,因此它将沿着整个df进行广播

如有必要,您可以在以后将索引设置回:

In [80]:
df = df.reset_index()
df = df.sub(df[df['Position Y'] == -27.0].iloc[0], axis=1)
df = df.set_index(df.columns[:3].tolist())
df

Out[80]:
                                  Analog 1
Position Y Position X Position Z          
0.0        0.0        0.0             0.00
0.5        0.0        0.0             0.00
1.0        0.0        0.0             0.00
1.5        0.0        0.0             0.00
2.0        0.0        0.0            -0.02

如果我的答案解决了您的问题,那么您可以接受它,我的答案的左上角将有一个空的勾号,这样问题就不会一直没有答案相关的问题(实际上使用多索引:)如果我只有一行索引“位置Y”=-27,这将是一种方法。但是我有很多沿y方向的xz平面。我已经更正了这个问题以强调这一点。很抱歉,您现在已经实质性地更改了您的问题,您应该接受这个答案并提出一个新问题。此外,我不明白在这种情况下最终的df是什么样子,这里的问题是,当您有多行时,您将遇到对齐列和索引的问题,以及如何减去它们
In [80]:
df = df.reset_index()
df = df.sub(df[df['Position Y'] == -27.0].iloc[0], axis=1)
df = df.set_index(df.columns[:3].tolist())
df

Out[80]:
                                  Analog 1
Position Y Position X Position Z          
0.0        0.0        0.0             0.00
0.5        0.0        0.0             0.00
1.0        0.0        0.0             0.00
1.5        0.0        0.0             0.00
2.0        0.0        0.0            -0.02