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

