Python 通过应用来加快速度

Python 通过应用来加快速度,python,pandas,Python,Pandas,我有一个dataframe,我想按一列对它进行分组,同时对它应用许多函数。不幸的是,这需要太长时间。我需要一些十倍的改进。我读过关于矢量化的文章,但是我失去了很多功能 这是我的方法,首先我定义了我需要的所有函数: def f(x): d = {} d['min_min_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].min() d['max_max_approved'] = x['

我有一个dataframe,我想按一列对它进行分组,同时对它应用许多函数。不幸的是,这需要太长时间。我需要一些十倍的改进。我读过关于矢量化的文章,但是我失去了很多功能

这是我的方法,首先我定义了我需要的所有函数:

def f(x):
    d = {}
    d['min_min_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].min()
    d['max_max_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].max()
    d['sum_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].sum()
    d['avg_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].mean()
    d['std_approved'] = x['scoring_dol_amount'][x['payment_status']=='approved'].std()
    d['sum_approved_tpn'] = x['scoring_dol_amount'][x['payment_status']=='approved'].count()
    d['sum_rejected_tpn'] = x['scoring_dol_amount'][x['payment_status']=='rejected'].count()
    d['sum_rejected_tpn_hr'] = x['scoring_dol_amount'][x['payment_status_detail']=='cc_rejected_high_risk'].count()
    d['sum_rejected'] = x['scoring_dol_amount'][x['payment_status']=='rejected'].sum()
    d['sum_rejected_hr'] = x['scoring_dol_amount'][x['payment_status_detail']=='cc_rejected_high_risk'].sum()
    d['avg_rejected'] = x['scoring_dol_amount'][x['payment_status']=='rejected'].mean()
    d['std_rejected'] = x['scoring_dol_amount'][x['payment_status']=='approved'].std()
    d['sum_late_hours'] = x['scoring_dol_amount'][(x['payment_date_created'].dt.hour >=23) | (x['payment_date_created'].dt.hour <=6)].count()
    #d['ratio_receive'] = (x['scoring_dol_amount'][x['payment_status']=='approved'].sum())/(x['scoring_dol_amount'][x['payment_status']=='rejected'].sum()+x['scoring_dol_amount'][x['payment_status']=='approved'].sum())
    #d['ratio_receive_tpn'] = (x['scoring_dol_amount'][x['payment_status']=='approved'].count())/(x['scoring_dol_amount'][x['payment_status']=='rejected'].count()+x['scoring_dol_amount'][x['payment_status']=='approved'].count())
    #d['distinct_tc']= x['tc'].nunique()
    #d['distinct_doc']= x['payer_identification_number'].nunique()
    #d['ratio_tc']= (x['tc'].nunique())/(x['scoring_dol_amount'][x['payment_status']=='approved'].count())
    #d['ratio_doc']= (x['payer_identification_number'].nunique())/(x['scoring_dol_amount'][x['payment_status']=='approved'].count())

    return pd.Series(d, index=['min_min_approved', 'max_max_approved', 'sum_approved', 'avg_approved','std_approved','sum_approved_tpn','sum_rejected_tpn','sum_rejected_tpn_hr','sum_rejected','sum_rejected_hr','avg_rejected','std_rejected','sum_late_hours'])#,'ratio_receive','ratio_receive_tpn','distinct_tc','distinct_doc','ratio_tc','ratio_doc'])

我怎样才能加快速度呢?

看起来你已经做了一些东西,已经包含在熊猫中了。只需
groupby()
cust\u id和
payment\u status
列,您当前正在筛选并使用
agg()


内置功能比自定义
apply
更快,在您的情况下,您可以使用3个个人
groupby
使用
payment\u status
payment\u status\u detail
payment\u date\u created
作为键:

group1 = x.groupby(["cust_id", "payment_status"])
stats1 = group1['scoring_dol_amount'].agg(["mean", "std", "sum", "min", "max", "count"])

group2 = x.groupby(["cust_id", "payment_status_detail"])
stats2 = group2['scoring_dol_amount'].agg(["sum", "count"])

group3 = x.groupby(["cust_id", (x['payment_date_created'].dt.hour >=23) | (x['payment_date_created'].dt.hour <=6)])
stats3 = group3['scoring_dol_amount'].count()
group1=x.groupby([“客户id”、“付款状态”])
stats1=第1组[“得分金额”].agg([“平均”、“标准”、“总和”、“最小”、“最大”、“计数”])
group2=x.groupby([“客户id”、“付款状态详细信息”])
stats2=第2组[“得分金额”].agg([“总和”、“计数”])

group3=x.groupby([“cust_id”,(x['payment_date_created'].dt.hour>=23)|(x['payment_date_created'].dt.hour请阅读并将问题简化为一个仍然保持问题精神的最小示例。您是否尝试过将代码中重复的部分放在不同的变量中?最后一个方法太快了。谢谢。
dataset_recibido.groupby(['cust_id','payment_status']])\
                          .agg(['count','mean','std','sum','min','max'])
group1 = x.groupby(["cust_id", "payment_status"])
stats1 = group1['scoring_dol_amount'].agg(["mean", "std", "sum", "min", "max", "count"])

group2 = x.groupby(["cust_id", "payment_status_detail"])
stats2 = group2['scoring_dol_amount'].agg(["sum", "count"])

group3 = x.groupby(["cust_id", (x['payment_date_created'].dt.hour >=23) | (x['payment_date_created'].dt.hour <=6)])
stats3 = group3['scoring_dol_amount'].count()