首页 > 解决方案 > 如何使用 Pandas 进一步优化我的代码以解决所需的问题

问题描述

我创建了以下数据集

dataset1 = { 'srid':[1,2,3,1,5],
            'custid':[11,12,43,12,34],
            'orderdate':["1/2/2019","1/2/2019","2/2/2019","1/2/2019","1/2/2019"],
            'Rev':[100,101,102,103,17]
}

df1 = pd.DataFrame(dataset1)

我必须将每个销售代表标记为:优秀(他一天的总收入是当天所有销售代表平均收入的 1.5 倍或更大) 好(他一天的总收入小于 1.5 倍或更大)大于等于所有销售代表当天平均收入的 1.1 倍)平均(其中他的一天总收入小于等于当天所有销售代表平均收入的 1.1 倍且大于等于 0.9 倍)差(其中他一天的总收入小于当天所有销售代表平均收入的 0.9 倍)对于“数据集 1”中存在的每个日期输出数据集:销售代表 ID、订单日期、标记

我尝试的是:

g=df.groupby(df['orderdate'])
ans={}
for od,od_df in g:
   # print(od)
    ans[od]=list()
    x=od_df["Rev"].mean()
    s=set(od_df["srid"].tolist())
    for i in s:
        p=od_df[od_df["srid"]==i]["Rev"].sum()
        val = p/x
        if val>=1.5:
            ans[od].append([i,od,"Excellent"])
        elif 1.1<=val<1.5:
            ans[od].append([i,od,"good"])
        elif 0.9<=val<1.1:
            ans[od].append([i,od,"avg"])
        else:
            ans[od].append([i,od,"poor"])

但这要写很多,并且需要更多时间在大数据集上我如何进一步优化它

标签: pythonpandas

解决方案


与您的相比,我无法真正测试实现的速度,因为 5 个值比其他任何东西都更能衡量开销。然而,裸循环在 pandas 中往往效率很低。您可以像这样得到平均值的相对差异:

In [15]: df.groupby('orderdate').apply(lambda _df: _df['Rev'] / _df['Rev'].mean())                                                                                                                         
Out[15]: 
orderdate   
1/2/2019   0    1.2461
           1    1.2586
           3    1.2835
           4    0.2118
2/2/2019   2    1.0000
Name: Rev, dtype: float64

并用于pd.cut将其转换为序数比例

In [28]: df['RevMark'] = pd.cut(df.groupby('orderdate').apply(lambda _df: _df['Rev'] / _df['Rev'].mean()).sort_index(level=1).values, [0,0.9,1.1,1.5,np.inf], labels=['poor', 'avg', 'good', 'excellent']) 

In [29]: df                                                                                                                                                                                                
Out[29]: 
   srid  custid orderdate  Rev RevMark
0     1      11  1/2/2019  100    good
1     2      12  1/2/2019  101    good
2     3      43  2/2/2019  102     avg
3     1      12  1/2/2019  103    good
4     5      34  1/2/2019   17    poor

sort_index是必要的,因为分组后的值按日期排序,因此关联是错误的。的第二个参数cut是您想要的间隔的边界,标签是您所谓的标记。

就时间而言,您需要自己在足够大的样本上进行测量。


推荐阅读