2017-09-09 73 views
1

我有一些非常大的数据集,包括x,y和z值。这些数据集代表时间内插高度测量。第一个数据集(原始数据集)包含整个区域的数据。在该地区的部分时间再次被测量。我想在x和y相等但z不同的位置覆盖原始数据集(位置(x,y)处的高度发生了变化)。熊猫两个数据帧多列值比较

所以我dataframes是这个样子

原文:

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 

我可以l通过所有的测量,并看到x和y出现在原始和如果z值是不同的(如果是这样,取而代之),但这需要永远,我可以想象,一定有更好的方式使用熊猫。我将如何以快速有效的方式来做到这一点?

+0

正确的,只是改变了它。 – Yorian

回答

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 
+0

这是一个很酷的把戏! – chrisckwong821

+0

非常好的解决方案! – Yorian

1

可以使用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 

详细使用上df1

mergedf2x, y
assign新列zfillna

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 
+0

我可以让你在我的帖子上投票吗?谢谢https://stackoverflow.com/a/46192213/2336654 – piRSquared

-1
original[(original.x == new.x) | (original.y == new.y)].z = new.z 
+0

这不起作用,它会抛出一个错误(除了|需要成为&以外) – Yorian