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

2024-05-13 02:38:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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']
  • 似乎我可以使用索引将一列插入到数据帧中,但不能超过一列。

很明显,我可以遍历列并分别执行每个列,但是有没有一种更紧凑的方法来完成我试图执行的任务,这种方法更类似于单列解决方案?


Tags: 方法dataframedf原因传感器标签数据表dataframes
1条回答
网友
1楼 · 发布于 2024-05-13 02:38:35

数据帧通常对齐列和行索引上的算术运算。由于df[['x','y']]df[['dx','dy']]具有不同的列名,因此dx列不会从x列中减去,而类似于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数组(在右边) 对于数据帧(在左侧),左侧指定的列名必须已存在。

相反,在将右侧的数据帧分配给左侧的数据帧时,可以使用新列,因为in this casePandas将左侧的键(新列名)与右侧的列一起拉入,并按列顺序分配值,而不是通过对齐列:

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

因此,使用右边的数据帧

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

可以,但是使用右边的NumPy数组

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

没有。

相关问题 更多 >