我有一张传感器数据表,其中一些列是测量值,一些列是传感器偏差。例如,像这样:
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']]
有两个原因,似乎。
['x', 'y', 'dx', 'dy']
。显然,我可以遍历列并单独执行每个列,但是有更简洁的方法来完成我正在尝试做的事情,这更类似于一列解决方案吗?
答案 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
没有。