pandas中函数的矢量化实现

2024-06-09 15:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我目前的职能:

def partnerTransaction(main_df, ptn_code, intent, retail_unique):

    if intent == 'Frequency':
        return main_df.query('csp_code == @retail_unique & partner_code == @ptn_code')['tx_amount'].count()

    elif intent == 'Total_value':
        return main_df.query('csp_code == @retail_unique & partner_code == @ptn_code')['tx_amount'].sum()

它所做的是接受一个Pandas数据帧(df1)和三个搜索参数。retail_unique是来自另一个数据帧(DF 2)的字符串。目前,我使用itertuples迭代df2的行,调用大约200个这样的函数并写入第三个DF,这只是一个例子。我在DF 2中有大约16000行,所以它非常慢。我要做的是矢量化这个函数。我想它返回一个熊猫系列,有计数每零售额唯一。所以这个系列会是

^{pr2}$

然后我将把这个系列映射到第三个DF。在

我有什么办法吗?在

编辑:第一个DF包含基于时间的数据,每个零售店在一列中出现多次,而tx_金额在另一列中出现,如下所示

Retail  tx_amount
retail_a  50
retail_b  100
retail_a  70
retail_c  20
retail_a  10

第二个DF按零售商安排:

Retail
retail_a
retail_b
retail_c

Tags: 数据dfpartnerreturnmaincodequeryamount
2条回答

如果您想要速度,这里有一个使用bincountnumpy解决方案

from collections import OrderedDict

f, u = pd.factorize(df1.Retail.values)

c = np.bincount(f)
s = np.bincount(f, df1.tx_amount.values).astype(df1.tx_amount.dtype)

pd.DataFrame(OrderedDict(Frequency=c, Total_value=s), u)

          Frequency  Total_value
retail_a          3          130
retail_b          1          100
retail_c          1           20

计时

^{pr2}$

首先将^{}left join一起使用。在

然后按列tx_amount^{}进行^{},并通过^{}函数^{}和{a6}聚合在一起或分别在第二个解中。在

Series转换为2列DataFrame的最后一个^{}

如果需要同时输出:

def partnerTransaction_together(df1, df2):
    df = pd.merge(df1, df2, on='Retail', how='left')
    d = {'size':'Frequency','sum':'Total_value'}
    return df.groupby('Retail')['tx_amount'].agg(['size','sum']).rename(columns=d)

print (partnerTransaction_together(df1, df2))
          Frequency  Total_value
Retail                          
retail_a          3          130
retail_b          1          100
retail_c          1           20

但如果需要使用条件:

^{pr2}$

相关问题 更多 >