影刀RPA 数据排序排名:多字段排序与TOP-N 影刀RPA 数据排序排名多字段排序与TOP-N作者林焱什么情况用什么采集到几千条销售数据需要按销售额从高到低排、按地区分组再按月份排序、找出销量TOP10的产品。在影刀RPA里用pandas的sort_values和rank可以轻松实现多字段排序和排名比在Excel里手动排序快得多。适用场景销售排行榜生成、绩效排名计算、TOP-N筛选、多维度排序报表。怎么做基础排序拼多多店群自动化上架方案importpandasaspd dfpd.read_excel(rC:\Data\sales.xlsx)# 单列排序df_sorteddf.sort_values(金额,ascendingFalse)# 降序df_sorteddf.sort_values(日期,ascendingTrue)# 升序# 多列排序先按地区升序同地区内按金额降序df_sorteddf.sort_values([地区,金额],ascending[True,False])排名计算# 添加排名列df[金额排名]df[金额].rank(methoddense,ascendingFalse)# 分组排名每个地区内的金额排名df[地区内排名]df.groupby(地区)[金额].rank(methoddense,ascendingFalse)# 百分比排名df[百分位]df[金额].rank(pctTrue)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5f5dea20345c477f8b0d4b8686800ad0.png#pic_center)# rank的method参数# average: 同值取平均名次默认1,2,2,4# min: 同值取最小名次 1,2,2,4# max: 同值取最大名次 1,3,3,4# dense: 同值同名次不跳号 1,2,2,3# first: 按出现顺序 1,2,3,4TOP-N筛选# 全局TOP10top10df.nlargest(10,金额)# 每个地区TOP3top3_per_regiondf.groupby(地区).apply(lambdax:x.nlargest(3,金额)).reset_index(dropTrue)# BOTTOM5最差的5个bottom5df.nsmallest(5,金额)# 每个部门工资最高的3人top_salariesdf.groupby(部门).apply(lambdax:x.nlargest(3,工资)[[姓名,工资]]).reset_index(dropTrue)多字段排序实战defmulti_field_sort(df,sort_config): 多字段排序 sort_config: [(字段1, True/False), (字段2, True/False), ...] True升序, False降序 columns[c[0]forcinsort_config]ascending[c[1]forcinsort_config]returndf.sort_values(columns,ascendingascending).reset_index(dropTrue)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b60b06935b3e422f9b8afeb7f5e58a16.png#pic_center)# 使用先按地区升序再按金额降序最后按日期升序resultmulti_field_sort(df,[(地区,True),(金额,False),(日期,True)])生成排行榜报表defgenerate_ranking_report(df,output_path):生成排行榜报表withpd.ExcelWriter(output_path,engineopenpyxl)aswriter:# 1. 销售额TOP20top20df.nlargest(20,金额)[[日期,地区,产品,数量,金额]].reset_index(dropTrue)top20.insert(0,排名,range(1,len(top20)1))top20.to_excel(writer,sheet_nameTOP20,indexFalse)# 2. 各地区TOP5region_top5df.groupby(地区).apply(lambdax:x.nlargest(5,金额)).reset_index(dropTrue)region_top5[地区内排名]region_top5.groupby(地区)[金额].rank(methoddense,ascendingFalse).astype(int)region_top5.to_excel(writer,sheet_name各地区TOP5,indexFalse)# 3. 产品销量排行product_rankdf.groupby(产品).agg(总销量(数量,sum),总金额(金额,sum),订单数(订单ID,count)).sort_values(总金额,ascendingFalse).reset_index()product_rank.insert(0,排名,range(1,len(product_rank)1))product_rank.to_excel(writer,sheet_name产品排行,indexFalse)# 4. 月度趋势df[月份]pd.to_datetime(df[日期]).dt.to_period(M).astype(str)monthlydf.groupby(月份).agg(订单数(订单ID,count),总金额(金额,sum)).sort_values(月份).reset_index()monthly[环比增长]monthly[总金额].pct_change().fillna(0)monthly.to_excel(writer,sheet_name月度趋势,indexFalse)returnoutput_path# 使用generate_ranking_report(df,rC:\Data\ranking_report.xlsx)影刀RPA中的操作【读取Excel文件】→ sales.xlsx 【执行Python代码】→ 多字段排序 【执行Python代码】→ 计算排名 【执行Python代码】→ TOP-N筛选 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/deb9f9c434b74813a2e8ed4714e4a89a.png#pic_center) 【写入Excel文件】→ ranking.xlsx有什么坑坑1排序后索引乱TEMU店群如何管理运营# 问题排序后索引还是原来的看起来乱df_sorteddf.sort_values(金额,ascendingFalse)print(df_sorted.index)# 可能是 5, 3, 8, 1, ... 乱序# 解决重置索引![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2e4eafd43bd04f5cb5d73f7fbd876d8e.png#pic_center)df_sorteddf.sort_values(金额,ascendingFalse).reset_index(dropTrue)# 现在 0, 1, 2, 3, ... 整齐坑2空值排序位置不确定# 问题排序列有空值时空值可能排最前面或最后面df.sort_values(金额)# 空值默认在最后升序# 控制空值位置df.sort_values(金额,ascendingFalse,na_positionlast)# 空值在最后df.sort_values(金额,ascendingFalse,na_positionfirst)# 空值在最前坑3groupbyrank返回MultiIndex# 问题分组排名后索引变成MultiIndexdf[排名]df.groupby(地区)[金额].rank()# 索引可能是 (地区, 原索引) 形式# 解决不要用apply直接用transform![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2aa6470268df4d0891ecbb40642235c0.png#pic_center)df[排名]df.groupby(地区)[金额].rank(methoddense,ascendingFalse).astype(int)# 这样索引和原df一致坑4nlargest返回的行数不够# 问题nlargest(10)但数据只有8行返回8行# 或者分组后某些组不足N条# 检查返回行数top10df.nlargest(10,金额)iflen(top10)10:print(f警告只有{len(top10)}条数据不足10条)# 分组TOP-N时某些组可能不足N条top3df.groupby(地区).apply(lambdax:x.nlargest(3,金额))# 广州只有2条数据返回2条而不是3条坑5排序稳定性问题# 问题同金额的行每次排序顺序可能不同df.sort_values(金额)# 同金额的行顺序不确定# 解决加第二排序字段保证稳定df.sort_values([金额,订单ID])# 同金额时按订单ID排序![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4a74f2878b2b4c64bdd9544aafff2ae1.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6082a6d2ff394a7c877f5aa8e61ddb83.png#pic_center)# 或用kind参数指定排序算法df.sort_values(金额,kindmergesort)# 稳定排序