You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas分组后对指定列基于特定值执行插值?

分组多列插值需求与实现方案

需求说明

  • 针对DataFrame中的**一组列(如val1、val2)**执行插值操作,而非全部列或单个列
  • 插值参考列(pivot_column)中通常不存在目标值(例如15)
  • 需按input_date字段分组,计算每个日期下pivot_column=15时val1、val2的插值结果

实现方案

方法1:添加目标行后调用插值函数

步骤清晰直观,适合需要保留原始数据+插值结果的场景:

  1. 生成每个input_date对应的pivot_column=15空值行,合并到原DataFrame
  2. 按input_date分组,对每组的pivot_column排序后,用interpolate()对目标列插值
  3. 筛选出pivot_column=15的行得到最终结果

示例代码:

import pandas as pd

# 模拟原始数据
df = pd.DataFrame({
    'input_date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
    'pivot_column': [10, 20, 5, 25],
    'val1': [100, 200, 50, 250],
    'val2': [10, 20, 5, 25]
})

# 生成每个日期的目标插值行
target_rows = pd.DataFrame({
    'input_date': df['input_date'].unique(),
    'pivot_column': 15,
    'val1': None,
    'val2': None
})

# 合并数据并分组插值
merged_df = pd.concat([df, target_rows]).sort_values(['input_date', 'pivot_column'])
result = merged_df.groupby('input_date').apply(
    lambda x: x.interpolate(method='linear', limit_direction='both')
).query('pivot_column == 15').reset_index(drop=True)

print(result)

方法2:分组后直接用np.interp计算

无需额外添加行,直接计算目标值的插值,性能更优,适合仅需目标插值结果的场景:

示例代码:

import pandas as pd
import numpy as np

# 模拟原始数据
df = pd.DataFrame({
    'input_date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
    'pivot_column': [10, 20, 5, 25],
    'val1': [100, 200, 50, 250],
    'val2': [10, 20, 5, 25]
})

def interpolate_at_target(group, target=15):
    # 先对参考列排序,保证插值逻辑正确
    sorted_group = group.sort_values('pivot_column')
    x = sorted_group['pivot_column'].values
    # 计算val1、val2在target值处的线性插值
    val1_interp = np.interp(target, x, sorted_group['val1'].values)
    val2_interp = np.interp(target, x, sorted_group['val2'].values)
    return pd.Series({
        'input_date': sorted_group['input_date'].iloc[0],
        'pivot_column': target,
        'val1': val1_interp,
        'val2': val2_interp
    })

result = df.groupby('input_date').apply(interpolate_at_target).reset_index(drop=True)
print(result)

方案对比

  • 方法1逻辑简单易懂,可保留完整的原始+插值数据集,但会临时增加数据量
  • 方法2轻量化,直接计算目标插值结果,运行效率更高

内容的提问来源于stack exchange,提问作者Hotone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:35:05