[英]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.