在pandas DataFrame中减去多列并追加结果

3

我有一张传感器数据表,其中一些列是测量值,另一些列是传感器偏差。例如,像这样:

df=pd.DataFrame({'x':[1.0,2.0,3.0],'y':[4.0,5.0,6.0],
                 'dx':[0.25,0.25,0.25],'dy':[0.5,0.5,0.5]})
    dx   dy    x    y
0  0.25  0.5  1.0  4.0
1  0.25  0.5  2.0  5.0
2  0.25  0.5  3.0  6.0
我可以通过从测量值中减去偏差来向表格中添加一列,方法如下:
df['newX'] = df['x'] - df['dx']
    dx   dy    x    y  newX
0  0.25  0.5  1.0  4.0  0.75
1  0.25  0.5  2.0  5.0  1.75
2  0.25  0.5  3.0  6.0  2.75

但我希望一次性为多个列执行此操作。以下方法无效:

df[['newX','newY']] = df[['x','y']] - df[['dx','dy']]

似乎有两个原因。
  • 当从数据框中减去另一个数据框时,列标签用于对齐减法运算,因此结果将包含4列['x', 'y', 'dx', 'dy']
  • 看起来可以使用索引将单个列插入到数据框中,但是不能插入多个列。
显然,我可以迭代每列并单独处理,但是否有更紧凑的方法来实现我所尝试做的事情,更类似于一列解决方案?
1个回答

13
数据框通常会对列和行索引进行算术运算等操作。由于 df[['x','y']]df[['dx','dy']] 具有不同的列名,因此不会从 x 列中减去 dx 列,y 列也是如此。
相反,如果你从数据框中减去一个 NumPy 数组,则元素级别地执行操作,因为 NumPy 数组没有 Panda 风格的索引可以对齐。
因此,如果你使用 df[['dx','dy']].values 提取由 df[['dx','dy']] 中的值组成的 NumPy 数组,则可以按预期进行赋值。
import pandas as pd

df = pd.DataFrame({'x':[1.0,2.0,3.0],'y':[4.0,5.0,6.0],
                 'dx':[0.25,0.25,0.25],'dy':[0.5,0.5,0.5]})
df[['newx','newy']] = df[['x','y']] - df[['dx','dy']].values
print(df)

产量
     dx   dy    x    y  newx  newy
0  0.25  0.5  1.0  4.0  0.75   3.5
1  0.25  0.5  2.0  5.0  1.75   4.5
2  0.25  0.5  3.0  6.0  2.75   5.5

请注意,如果您尝试将NumPy数组(在右侧)分配给DataFrame(在左侧),则左侧指定的列名必须已经存在。

相反,当将右侧的DataFrame分配给左侧的DataFrame时,可以使用新列,因为在这种情况下 Pandas会将左侧的键(新列名)与右侧的列一起压缩,并按列顺序分配值而不是通过对齐列:

            for k1, k2 in zip(key, value.columns):
                self[k1] = value[k2]

因此,在右侧使用DataFrame
df[['newx','newy']] = df[['x','y']] - df[['dx','dy']].values

工作正常,但在右侧使用NumPy数组

df[['newx','newy']] = df[['x','y']].values - df[['dx','dy']].values

不。


1
搞定了。我尝试使用.values对两个参数进行减法运算,但它抱怨说'newx'和'newy'不在索引中。我猜想这是因为如果我对两个都使用.values,那么我正在分配一个numpy数组,但如果我只对第二个使用.values,那么我正在分配一个DataFrame? - Omegaman
1
是的,没错。当右侧的值为DataFrame时,_setitem_array会跟随不同的代码路径。当它是一个NumPy数组时,它会在df.columns中查找列 newxnewy,找不到它们,因此引发KeyError。因此,在左侧引用的列已经存在于df中时,才能使用NumPy数组(在右侧)。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接