pandas两个数据帧的多列值比较

时间:2017-09-09 07:43:24

标签: python pandas

我有一些非常大的数据集,包含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值不同(如果是,则替换它)但这需要永远,我可以想象必须有更好的方法用熊猫。我该如何快速高效地完成这项工作?

3 个答案:

答案 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> df1df2x, 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