我有两个示例数据框:
df1 = pd.DataFrame({'Depth':[1100, 1110, 1120, 1130, 1140], 'GR':[40, 50, 60, np.nan, 70]})
df2 = pd.DataFrame({'Depth':[1100, 1112, 1118, 1128, 1138], 'VSH':[60, 70, np.nan, 40, 70]})
Depth GR
0 1100 40.0
1 1110 50.0
2 1120 60.0
3 1130 NaN
4 1140 70.0
Depth VSH
0 1100 60.0
1 1112 70.0
2 1118 NaN
3 1128 40.0
4 1138 70.0
第一个数据显示,从深度1120到1140,'GR'值为空。同样,在第二个数据帧中,从 1112 到 1128 的深度“VSH”为空。我想通过“深度”上的外连接来连接这些数据集,并通过实际“GR”已知的插值来填充空值。我的意思是,在最终连接的数据集中,不应对“GR”值进行插值(保留为空),其中“GR”的深度在 1120 和 1140 之间,因为在此间隔“GR”与第一个数据集中一样是未知的。同样,深度 1112 和 1128 之间的“VSH”值应为空(未插值)。在特定间隔内插值后的输出应该是这样的:
merged_df = pd.DataFrame({'Depth':[1100, 1110, 1112, 1118, 1120, 1128, 1130, 1138, 1140], 'GR':[40, 50, 53.3, 56.6, 60, np.nan, np.nan, np.nan, 70], 'VSH':[60, 65, 70, np.nan, np.nan, 40, 50, 60, 70]})
Depth GR VSH
0 1100 40.0 60.0
1 1110 50.0 65.0
2 1112 53.3 70.0
3 1118 56.6 NaN
4 1120 60.0 NaN
5 1128 NaN 40.0
6 1130 NaN 50.0
7 1138 NaN 60.0
8 1140 70.0 70.0
你怎么能在 pandas 中做到这一点?
假设您没有无限值,一种选择可能是使用 Inf 作为哨兵来标记这些值不进行插值:
out = (df1.fillna(np.inf)
.merge(df2.fillna(np.inf),
on='Depth', how='outer')
.sort_values(by='Depth')
.interpolate()
.replace(np.inf, np.nan)
)
输出:
Depth GR VSH
0 1100 40.000000 60.0
1 1110 50.000000 65.0
5 1112 53.333333 70.0
6 1118 56.666667 NaN
2 1120 60.000000 NaN
7 1128 NaN 40.0
3 1130 NaN 60.0
8 1138 NaN 80.0
4 1140 70.000000 80.0