繁体   English   中英

Pandas:在 Left Outer Join 之后用另一个 dateframe 中的值填充 NaN 值并且没有公共行

[英]Pandas: Fill NaN values after Left Outer Join with values in another dateframe and with no common rows

考虑以下两个数据框:

df1:

time                       p_value       
2022-03-12 00:00:00+00:00  38743.7
2022-03-12 00:05:00+00:00    38802
2022-03-12 00:10:00+00:00    38842
2022-03-12 00:15:00+00:00  38865.9
2022-03-12 00:20:00+00:00  38882.1
2022-03-12 23:35:00+00:00    38965
2022-03-12 23:40:00+00:00  38933.2
2022-03-12 23:45:00+00:00  38878.4
2022-03-12 23:50:00+00:00  38861.3
2022-03-12 23:55:00+00:00  38803.9

df2:

time                       b_value      
2022-03-12 00:27:12+00:00  13
2022-03-12 00:29:26+00:00  14
2022-03-12 00:31:37+00:00  15                     
2022-03-12 23:19:38+00:00  16
2022-03-12 23:33:10+00:00  17
2022-03-12 23:41:52+00:00  18

df1包含完整范围的日期时间索引,特定日期的分辨率为5 minutes 即它有24*60/5 = 288条记录。

df2的索引低于df1 < 288,它们可能都与df1中的索引不同。

问题是我们如何合并这两个数据帧,以便对于df2的每个索引,使用距离df1最近的索引值。

# Left outer join
desired_df = df2.merge(df1, on='time', how='left')

换句话说,我们如何根据另一个 dataframe 中的值填充NaN值。

所需的 df:

time                       new_col      
2022-03-12 00:27:12+00:00  38882.1
2022-03-12 00:29:26+00:00  38882.1
2022-03-12 00:31:37+00:00  38882.1                     
2022-03-12 23:19:38+00:00  38965
2022-03-12 23:33:10+00:00  38965
2022-03-12 23:41:52+00:00  38933.2

另一个想法是,对于df2中的每个索引,我们可以计算接近该索引的两个连续索引之间的平均值。 例如,对应于索引2022-03-12 23:41:52+00:00的值将是2022-03-12 23:40:00+00:002022-03-12 23:45:00+00:00值的平均值2022-03-12 23:45:00+00:00


在 JonClements 的评论之后,这是一个非常简单的解决方案!

pd.merge_asof(left=df2, right=df1, on='time')

您可以尝试使用pandas 插值

merged = df2.merge(df1, how='outer')
merged = pd.DataFrame(merged.set_index(pd.to_datetime(merged['time'])).drop('time', axis=1).sort_index()['p_value'])

merged['new_col'] = merged.apply(lambda x: x.interpolate('nearest'))
merged

Output:
                            p_value new_col
time        
2022-03-13 00:00:00+00:00   38743.7 38743.7
2022-03-13 00:05:00+00:00   38802.0 38802.0
2022-03-13 00:10:00+00:00   38842.0 38842.0
2022-03-13 00:15:00+00:00   38865.9 38865.9
2022-03-13 00:20:00+00:00   38882.1 38882.1
2022-03-13 00:27:12+00:00   NaN 38882.1
2022-03-13 00:29:26+00:00   NaN 38882.1
2022-03-13 00:31:37+00:00   NaN 38882.1
2022-03-13 23:19:38+00:00   NaN 38965.0
2022-03-13 23:33:10+00:00   NaN 38965.0
2022-03-13 23:35:00+00:00   38965.0 38965.0
2022-03-13 23:40:00+00:00   38933.2 38933.2
2022-03-13 23:41:52+00:00   NaN 38933.2
2022-03-13 23:45:00+00:00   38878.4 38878.4
2022-03-13 23:50:00+00:00   38861.3 38861.3
2022-03-13 23:55:00+00:00   38803.9 38803.9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM