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