查找Pandas数据帧之间的不同行,同时保留来自一个df

时间:2017-01-21 16:38:48

标签: python pandas

我有以下实际数据:

actual.code actual.distance
a             1
c             6
e             10

以及所有观察的以下插值数据:

interpolated.code   interpolated.distance
   a                     2
   b                     4
   c                     7
   d                     4
   e                     9
   f                     1

我想要以下输出:

 output.code    output.distance
     a                 1
     b                 4
     c                 6
     d                 4
     e                 10
     f                 1

因此,对于我没有实际数据的任何行,我想使用插值数据。我尝试了一个内连接,但似乎没有用,因为我想保留第一个数据帧的所有观察结果,并且只在必要时才使用第二个数据帧中的数据。

1 个答案:

答案 0 :(得分:2)

长版本是使用merge同时在结果中保留指标,然后根据指标将interpolated.distance替换为actual.distance

df_merge = df1.merge(df2, left_on="actual.code", right_on="interpolated.code", how="right", indicator=True)
df_merge["interpolated.distance"] = df_merge["interpolated.distance"].where(df_merge["_merge"] != "both", df_merge["actual.distance"]) 
df_merge.drop(["actual.code", "actual.distance", "_merge"], axis=1).sort_values("interpolated.code")

# interpolated.code interpolated.distance
#0          a                  1.0
#3          b                  4.0
#1          c                  6.0
#4          d                  4.0
#2          e                 10.0
#5          f                  1.0

或者另一种选择,您可以使用combine_first()df1作为调用对象,在获取值时将优先处理,基本上将两个数据帧中的代码设置为索引,并将与actual.distance作为调用对象的距离,如果代码匹配,这将优先考虑来自actual.distance的值:

(df1.set_index("actual.code")["actual.distance"]
 .combine_first(df2.set_index("interpolated.code")["interpolated.distance"])
 .rename_axis("output.code").rename("output.distance").reset_index())

#output.code    output.distance
#0     a              1.0
#1     b              4.0
#2     c              6.0
#3     d              4.0
#4     e             10.0
#5     f              1.0