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

Pandas中基于分组的数据类型校验、动态赋值及大数据量性能优化问题

Pandas中基于分组的数据类型校验、动态赋值及大数据量性能优化问题

我现在有一个数据处理的需求,需要在同一列内根据其他行的值设置单元格内容,并且要按eid列分组处理,具体需求如下:

  • 对每个eid分组,计算指定字段的最大值;
  • 如果分组内存在无效值(比如空值、非int/double类型),则不使用最大值,直接将该无效值赋值给目标行;若有多个无效值,任选其一即可;
  • 最终只保留PF标记为1的行,且要把分组计算好的值覆盖到该分组中PF=1的那一行上。

初始代码尝试

我一开始写了循环处理的逻辑,针对Transform_fields中的字段逐个进行处理:

Transform_fields = ('LV1','LV2')

for i in range(len(Transform_fields)):
        
        field_name = Transform_fields[i]
        
        data[field_name + '_org'] = data[field_name]

        try:
            data[field_name] = data[field_name].astype('float')
            
            data[field_name + '_max'] = data.groupby(['eid'])[field_name].transform(max)

            data[field_name + '_max'].fillna(data[field_name + '_org'], inplace = True)

            data[field_name] = data.groupby('eid')[field_name + '_max'].transform(lambda x: 0 if (x == 0).any() else x)
        except Exception as e:
            print('Error reading data from file ' +  str(e) + ': \n')
    
        # 需要更新分组中PF=1的记录的字段值

# 最后过滤保留PF=1的行
data = data[data['pf'] == '1']

数据样例说明

为了更清晰展示需求,我写了一段示例代码,用来对比输入DataFrame和期望的输出结果:

import pandas as pd

df_in = pd.DataFrame({'eid': [10001, 10001, 10002, 10002, 10003, 10004, 10004, 10004],
                   'LV1': ['', -8888, -8888, -8888, -8888, '&', 33, 'TIM'],
                   'LV2': [-8888, 'GRAY', 'blue', 9, 22, 55, 68, 166],
                   'PF': [1, 0, 1, 0, 1, 1, 0, 0]})
print('Original Dataframe:')
print(df_in)

df_out = pd.DataFrame({'eid': [10001, 10002,  10003, 10004],
                   'LV1': ['', -8888, -8888, '&'],
                   'LV2': ['GRAY', 'blue',  22, 166],
                   'PF': [1, 1, 1, 1]})

print("\nTransformed Dataframe:")
print(df_out)

后续性能问题反馈(提问3天后补充)

后来我按照用户@mozway的建议调整了代码,在小数据量下运行完全正常,但处理大规模数据时遇到了严重的性能瓶颈:

  • 数据规模是103000行×125列,Transform_fields包含125个字段;
  • 原循环版本运行了10分钟还未结束,只能手动中断;
  • 我尝试去掉循环,改成一次性分组聚合的方式,结果还是跑了10分钟以上,不得不终止执行:
# 一次性对所有列执行分组聚合操作
agg_dict = {field: cust_max for field in Transform_fields}
out = df_in.groupby('eid', as_index=False).agg(agg_dict)

目前还没找到合适的优化方案,希望能得到相关建议。

备注:内容来源于stack exchange,提问作者van_nash24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:23:08