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
相关产品推荐
相关产品推荐

