合并后,如何只插值非空区间?

问题描述 投票:0回答:1

我有两个示例数据框:

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

第一个数据显示,从深度11201140,'GR'值为空。同样,在第二个数据帧中,从 11121128 的深度“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 中做到这一点?

python pandas dataframe interpolation pandas-merge
1个回答
1
投票

假设您没有无限值,一种选择可能是使用 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
© www.soinside.com 2019 - 2024. All rights reserved.