python - 如何使用 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"])
但这要写很多,并且需要更多时间在大数据集上我如何进一步优化它
解决方案
与您的相比,我无法真正测试实现的速度,因为 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
是您想要的间隔的边界,标签是您所谓的标记。
就时间而言,您需要自己在足够大的样本上进行测量。
推荐阅读
- docker - 从容器内部运行 Gulp 而不用猛烈攻击
- ios - 如何在实时面部上映射面部轮廓点,我们从 Firebase MLKit for iOS 获得
- symfony - 跨form.placeholder Symfony 4
- css - 悬停在嵌套另一个 div 的 div 元素上不起作用
- r - 使用名称从工作区加载数据框
- javascript - 获取值变量
- python - 在 yampy python yammer api 中,只有登录后才能查看图像
- color-thief - ColorThief 库不会为不同平台上的单个图像生成相同的颜色
- javascript - 检测两个动态加载的图像的重叠
- c - 为什么 scanf 被执行了 11 次?