如何用上下行均值填充DataFrame中0值行?动态处理多行0值
使用Pandas动态填充DataFrame中value为0的行(含连续多0场景)
核心解决方案
利用Pandas的interpolate()方法结合值替换,可快速实现单个或连续多个0值的动态填充,填充逻辑为取前后最近非0值的线性插值(单个0时即为前后值的均值)。
步骤示例
- 构造示例DataFrame
import pandas as pd # 基础示例数据 data = { 'ds': ['2023-07-01 17:00:00', '2023-07-01 18:00:00', '2023-07-01 19:00:00'], 'value': [100, 0, 300] } df = pd.DataFrame(data) # 可选:将ds列转为时间类型,规范时间序列格式 df['ds'] = pd.to_datetime(df['ds'])
- 填充0值
# 将value列的0替换为缺失值NA df['value'] = df['value'].replace(0, pd.NA) # 用线性插值填充缺失值,自动适配单个/连续多个0的场景 df['value'] = df['value'].interpolate(method='linear')
执行后得到的结果:
ds value 0 2023-07-01 17:00:00 100.0 1 2023-07-01 18:00:00 200.0 2 2023-07-01 19:00:00 300.0
处理连续多个0的场景
如果存在连续多个0值,该方法会自动将前后非0值的差值均匀分配到每个缺失位置,示例如下:
# 含连续3个0的示例数据 data_multi = { 'ds': ['2023-07-01 17:00:00', '2023-07-01 18:00:00', '2023-07-01 19:00:00', '2023-07-01 20:00:00', '2023-07-01 21:00:00'], 'value': [100, 0, 0, 0, 500] } df_multi = pd.DataFrame(data_multi) df_multi['ds'] = pd.to_datetime(df_multi['ds']) # 同样的填充逻辑 df_multi['value'] = df_multi['value'].replace(0, pd.NA).interpolate(method='linear')
处理后结果:
ds value 0 2023-07-01 17:00:00 100.0 1 2023-07-01 18:00:00 200.0 2 2023-07-01 19:00:00 300.0 3 2023-07-01 20:00:00 400.0 4 2023-07-01 21:00:00 500.0
补充说明
- 如果希望保留原DataFrame不被修改,可以先复制再处理:
df_filled = df.copy()后执行填充逻辑。 - 若你的数据是严格按时间间隔排序的时间序列,也可以使用
method='time'进行插值,效果与linear一致,但会更贴合时间维度的逻辑。
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

