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

时间:2016-07-17 08:27:08

标签: python pandas

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

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']]

有两个原因,似乎。

  • 当减去DataFrames时,列标签用于对齐减法,因此最终得出4列结果['x', 'y', 'dx', 'dy']
  • 我似乎可以使用索引将单个列插入DataFrame,但不能超过一个。

显然,我可以遍历列并单独执行每个列,但是有更简洁的方法来完成我正在尝试做的事情,这更类似于一列解决方案吗?

1 个答案:

答案 0 :(得分:8)

DataFrame通常会对列和行索引上的算术运算进行对齐。由于df[['x','y']]df[['dx','dy']]具有不同的列名,因此不会从dx列中删除x列,并且类似于y列。

相反,如果从DataFrame中减去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时,可以使用新列,因为in this case 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

没有。