为神经网络预处理DataFrame:按Name统一每组2行的无循环实现方法
大规模DataFrame无循环标准化处理方案
整个方案完全基于pandas向量化操作实现,无Python层面逐行/逐组遍历,计算效率适配百万级以上数据量,完全满足每个Name固定2条记录的处理要求。
核心处理逻辑
分三步完成全流程,所有操作均为底层C实现的向量化计算:
- 对超过2条记录的Name,自动保留组内Score最高的2条
- 构建每个Name对应2条记录的完整对齐框架
- 自动补全不足2条记录的Name,缺失字段填充0
具体实现代码
import pandas as pd import numpy as np # 1. 组内排名筛选前2条高分记录 # 先按Name分组、Score降序排序 df_sorted = df.sort_values(by=['Name', 'Score'], ascending=[True, False]) # 生成组内排名,method='first'保证并列分数可任意取前2,无随机额外开销 df_sorted['group_rank'] = df_sorted.groupby('Name')['Score'].rank( method='first', ascending=False ) # 保留排名<=2的记录 df_filtered = df_sorted[df_sorted['group_rank'] <= 2] # 2. 构建每个Name对应2条记录的完整网格 # 提取所有唯一Name,每个Name重复2次,匹配1、2的组内排名位 all_unique_names = df['Name'].unique() name_template = pd.DataFrame({ 'Name': all_unique_names.repeat(2), 'group_rank': np.tile([1, 2], len(all_unique_names)) }) # 3. 对齐数据、补全缺失值 final_processed_df = name_template.merge( df_filtered, on=['Name', 'group_rank'], how='left' ).fillna({ 'Score': 0, 'Ind1': 0 }).drop(columns='group_rank')
效果匹配验证
针对提供的示例数据,最终输出完全匹配预期:
- Name A:原有2条记录,排名1为Score34、Ind11,排名2为Score31、Ind13,无补全无删除
- Name B:原有4条记录,筛选后保留排名1的Score40、Ind12,排名2的Score33、Ind13(并列分数按顺序取任意一条即可,无额外处理)
- Name C:原有1条记录(排名1为Score21、Ind15),排名2的位置自动补全Score0、Ind1为0的新行
优化提示
- 若需要并列分数下的随机选择效果,可在初始排序时增加一个随机列作为次级排序键,无额外循环开销
- 处理千万行级超大DataFrame时,可在分组计算排名时添加
sort=False参数,进一步减少排序计算量,提升速度 - 全程无
iterrows、apply逐行遍历逻辑,内存占用和计算速度比循环实现高1~2个数量级,适合神经网络输入的批量预处理场景
内容的提问来源于stack exchange,提问作者lvnwrth
相关产品推荐
相关产品推荐

