2017-01-09 90 views
2

我有一个熊猫DataFrame与3D测量(一些27k行)的数据。我已经创建了由3个坐标列(x,y,z)组成的多索引。数据看起来像(沿y方向的多个XZ平面):熊猫DataFrame减去横截面

        Analog 1 
Position Y Position X Position Z   
    y0   x0   z0  value0 
    y0   x0   z1  value1 
    y0   x0   z2  value2 
    y0   x1   z0  value3 
    y0   x1   z1  value4 
    y0   x1   z2  value5 
    y1   x0   z0  value6 
    y1   x0   z1  value7 
    y1   x0   z2  value8 
    y1   x1   z0  value9 
    y1   x1   z1  value10 
    y1   x1   z2  value11 

下面是一个例子:sample data

在下一步骤我想减去的交叉的值部分/切片在y=y0从每隔一个xz平面为了正常化我的数据。目前,我通过循环遍历每一行:

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 

有没有更优雅的方式?

+0

如果我的回答能够解决您的问题,那么你能接受的话,将会有我的答案左上方的空刻度线,是这样这个问题并不会得到解决 – EdChum

回答

3

它会更容易海事组织reset_index恢复指数值列,然后调用sub从感兴趣的行减去所有行:这里

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]索引第一行和唯一一行,这将返回Series,因此它将沿着整个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 
+0

这将是一种方法,如果我只有一行索引“位置Y”== -27。但是我沿着y方向有许多xz平面。我已经纠正了这个问题来强调这一点。 – RaJa

+0

对不起,你现在已经改变了你的问题,你应该接受这个答案并提出一个新问题。除此之外,我不明白在这种情况下最终的df是什么样子,这里的问题是,当你有多行时,你会遇到列和索引对齐的问题,以及它们应该如何被减少 – EdChum