【python】python multiprocessing多进程处理dataframe,快得飞起~

本文介绍如何利用Python的multiprocessing库优化pandas DataFrame的特征工程,通过多线程并行处理减少单核限制,显著提高处理速度。通过var_cross函数实例和多线程var_cross_multi函数的对比,展示了从单线程6.3分钟缩短到多线程1.18分钟的效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【python】python multiprocessing多进程处理dataframe,快得飞起~


建模过程中的特征工程工作往往是最耗时的大工程,很多场景下要使用pandas对数据进行加工处理,但pandas对数据的处理不能像Lightgbm训练数据一样自动设置了满线程运算(通过num_threads参数调控),导致其对数据的处理效率非常低下,尤其是在一个多核服务器上处理数据时,如果不做特殊处理,pandas对数据的运算只能使用一个核,是对时间和资源的极大浪费,本篇博客就来分享一下如何使用multiprocessing库充分利用计算资源,提高运行效率。

首先读入数据,指定变量。

import pandas as pd
import numpy as np

df = pd.read_csv('file.csv')
var_list = [x for x in df if x!='overdue_flag']

这里以var_cross函数为例,该函数的功能是对所有变量分箱进行两两组合(比如性别男且年龄30-35岁),找到坏账率明显区别于整体客群(明显高于或低于整体客群坏账率)的组合方式,记录下来,并将这样的组合以独热编码的方式(命中这样一个组合的打标为1,否则打标为0)生成一个新的变量。该函数返回两个dataframe,df_res是所有新生成的独热变量,res记录了哪些变量的哪些分箱进行组合,以及组合后的坏账率。(只为演示如何多线程处理,可以不对这个函数功能进行深究。)

def var_cross(res_col, target = 'overdue_flag', bad_thresh=0.12, good_thresh=0.04, num_rate=0.02, lift_rate=1.2):
    
    res = pd.DataFrame()
    df_res = pd.DataFrame()
    for group_col in res_col:

        group_df = df[list(group_col)+[target]].copy()
        for num_col in group_df.select_dtypes(include=[np.number]):
            if group_df[num_col].value_counts().shape[0]>=10:
                group_df[num_col] = pd.qcut(group_df[num_col],10,duplicates='drop').astype(str)
        
        tmp = group_df.groupby(list(group_col) if isinstance(group_col,tuple) else group_col)[target].agg({
   'count','mean'})
        for item in tmp.iterrows():
            if (item[1]['count']>df.shape[0]*num_rate)&((item[1]['mean']>bad_thresh)|(item[1]['mean']<good_thresh)):

                br1 = df.loc[df[group_col[0]]==item
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值