我有一张传感器数据表,其中一些列是测量值,一些列是传感器偏差.例如,像这样:
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)
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
我可以通过从测量中减去偏差来向表中添加一列,如下所示:
df['newX'] = df['x'] - df['dx']
Run Code Online (Sandbox Code Playgroud)
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
但我想立刻为许多专栏做这件事.这不起作用:
df[['newX','newY']] = df[['x','y']] - df[['dx','dy']]
Run Code Online (Sandbox Code Playgroud)
看来有两个原因.
['x', 'y', 'dx', 'dy'].显然,我可以遍历列并单独执行每个列,但有没有更紧凑的方法来完成我想要做的事情,这更像是一列解决方案?
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)
才不是.
| 归档时间: |
|
| 查看次数: |
6908 次 |
| 最近记录: |