[英]Fill NaN values in a pandas DataFrame depending on values of cells to its left
[英]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:00
和2022-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.