我有一些非常大的数据集,包含x,y和z值。这些数据集表示内插高度测量值。第一个数据集(原始数据集)包含整个区域的数据。及时测量了该区域的部分区域。我想覆盖x和y相等但z不同的位置的原始数据集(高度在位置(x,y)处发生了变化)。
所以我的数据框看起来像这样
原件:
x y z
1 1 0.5
1 2 0.5
1 3 0.5
2 1 0.5
2 2 0.5
2 3 0.5
3 1 0.5
3 2 0.5
3 3 0.5
新测量:
x y z
0 1 0.5
0 2 0.5
1 1 1.5
1 2 0.5
2 1 0.5
2 2 1.0
最终的数据框应如下所示:
x y z
1 1 1.5
1 2 0.5
1 3 0.5
2 1 0.5
2 2 1.0
2 3 0.5
3 1 0.5
3 2 0.5
3 3 0.5
我可以遍历所有的测量结果,看看x和y是否出现在原始状态中,如果z值不同(如果是,则替换它)但这需要永远,我可以想象必须有更好的方法用熊猫。我该如何快速高效地完成这项工作?
答案 0 :(得分:3)
鉴于'原始'为df1
而'新衡量'为df2
:
df3 = df1.set_index(['x', 'y'])
df3.update(df2.set_index(['x', 'y'])) # Inplace modificatioin on df3.
>>> df3.reset_index()
x y z
0 1 1 1.5
1 1 2 0.5
2 1 3 0.5
3 2 1 0.5
4 2 2 1.0
5 2 3 0.5
6 3 1 0.5
7 3 2 0.5
8 3 3 0.5
答案 1 :(得分:1)
您可以使用
merge
上的{p> df1
和df2
个x, y
的<{1}}
使用assign
的{{1}} z
fillna
新列z_x, z_y
drop
这些不受欢迎的列
In [716]: (df1.merge(df2, on=['x', 'y'], how='left')
.assign(z=lambda x: x.z_y.fillna(x.z_x))
.drop(['z_x', 'z_y'], 1))
Out[716]:
x y z
0 1 1 1.5
1 1 2 0.5
2 1 3 0.5
3 2 1 0.5
4 2 2 1.0
5 2 3 0.5
6 3 1 0.5
7 3 2 0.5
8 3 3 0.5
详细
In [717]: df1.merge(df2, on=['x', 'y'], how='left')
Out[717]:
x y z_x z_y
0 1 1 0.5 1.5
1 1 2 0.5 0.5
2 1 3 0.5 NaN
3 2 1 0.5 0.5
4 2 2 0.5 1.0
5 2 3 0.5 NaN
6 3 1 0.5 NaN
7 3 2 0.5 NaN
8 3 3 0.5 NaN
答案 2 :(得分:-1)
original[(original.x == new.x) | (original.y == new.y)].z = new.z