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

Pandas:按Equipment_id列拆分DataFrame后如何对各子数据框执行操作

方案评估与优化实现

现有方案的底层逻辑&性能问题说明

你现在的循环拆分方案底层逻辑是,每次执行df.loc[df['Equipment_id']==equipment_id]都会生成一个独立的DataFrame副本,对应组的所有行数据都会被复制一份到新的内存地址,存在两个明显问题:

  • 内存问题:如果设备数量过万、总数据量超千万行,内存占用会达到原始数据的2~3倍,极端情况会触发内存溢出
  • 耗时问题:每次筛选都要遍历全表匹配设备ID,时间复杂度为O(总行数*设备数),设备数量越多运算速度越慢,比原生方案慢5~10倍是常见情况

更简洁规范的实现方式

直接用pandas原生groupby方法即可,底层只会遍历全表一次生成组的索引映射,不会复制原始数据,自动规避跨设备计算的问题,也不需要手动拆分拼接:

单字段批量操作

插值处理

# 按Equipment_id分组后对每组传感器数据执行插值,自动忽略组间边界
df['sensor_reading'] = df.groupby('Equipment_id')['sensor_reading'].apply(lambda x: x.interpolate())

滚动窗口计算

window_size = 3 # 替换为实际窗口大小
df['rolling_min'] = df.groupby('Equipment_id')['sensor_reading'].apply(lambda x: x.rolling(window_size).min())

多变换批量处理

如果需要对单个设备组执行多个变换,可以自定义处理函数一次性完成:

def process_single_equipment(group_df):
    # 先按日期排序,保证插值、滚动计算结果正确
    group_df = group_df.sort_values('Date').reset_index(drop=True)
    # 插值补全缺失值
    group_df['sensor_reading'] = group_df['sensor_reading'].interpolate()
    # 滚动窗口计算最小值
    group_df['sensor_rolling_min'] = group_df['sensor_reading'].rolling(3).min()
    return group_df

# 分组处理后直接合并为完整DataFrame
processed_df = df.groupby('Equipment_id', group_keys=False).apply(process_single_equipment)

可选优化项

如果数据量较大,可以将Equipment_id转为category类型,分组速度可提升30%以上:

df['Equipment_id'] = df['Equipment_id'].astype('category')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:06:06