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

Ome*_*man 2 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]})
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)

我可以通过从测量中减去偏差来向表中添加一列,如下所示:

df['newX'] = df['x'] - df['dx']
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)

但我想立刻为许多专栏做这件事.这不起作用:

df[['newX','newY']] = df[['x','y']] - df[['dx','dy']]
Run Code Online (Sandbox Code Playgroud)

看来有两个原因.

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

显然,我可以遍历列并单独执行每个列,但有没有更紧凑的方法来完成我想要做的事情,这更像是一列解决方案?

unu*_*tbu 10

DataFrame通常对诸如列和行索引的算术等操作进行对齐.由于df[['x','y']]与df[['dx','dy']] 具有不同的列名,该dx列不会从减去x列,similiarly的y列.

相反,如果从DataFrame中减去NumPy数组,则操作是按元素进行的,因为NumPy数组没有要对齐的Panda样式索引.

因此,如果您使用df[['dx','dy']].values提取包含值的NumPy数组df[['dx','dy']],那么您的分配可以根据需要完成:

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)
Run Code Online (Sandbox Code Playgroud)

产量

     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
Run Code Online (Sandbox Code Playgroud)

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

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

            for k1, k2 in zip(key, value.columns):
                self[k1] = value[k2]
Run Code Online (Sandbox Code Playgroud)

因此,在右侧使用DataFrame

df[['newx','newy']] = df[['x','y']] - df[['dx','dy']].values
Run Code Online (Sandbox Code Playgroud)

工作,但在右边使用NumPy数组

df[['newx','newy']] = df[['x','y']].values - df[['dx','dy']].values
Run Code Online (Sandbox Code Playgroud)

才不是.