2017-01-09 87 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