繁体   English   中英

熊猫DataFrame减去横截面

[英]Pandas DataFrame subtract cross-section

我有一个带有3D测量数据(大约27k行)的pandas DataFrame。 我已经创建了由3个坐标列(x,y,z)组成的多索引。 数据看起来像这样(沿y方向的多个xz平面):

                                  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

这是一个示例: 样本数据

在下一步中,我想从每个其他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

有没有更优雅的方式?

IMO使用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]索引第一行和唯一行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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM