影刀RPA Excel条件求和:SUMIF与COUNTIF
作者:林焱
什么情况用什么
需要统计某个地区的销售总额、计算达成目标的订单数、按部门统计平均工资——这些条件统计在Excel里用SUMIF、COUNTIF、SUMIFS、COUNTIFS。但在影刀RPA处理大批量数据时,用pandas的分组聚合或条件筛选更快更灵活,还能写复杂条件。
适用场景:按条件汇总金额、统计满足条件的记录数、多条件交叉统计、分类排名计算。
怎么做
COUNTIF:条件计数
importpandasaspd df=pd.read_excel(r"C:\Data\sales.xlsx")# COUNTIF:统计销售额大于10000的订单数count=len(df[df['金额']>10000])# 统计某地区的订单数count_bj=len(df[df['地区']=='北京'])[video(video-kX15gV2g-1783502000801)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架!)]# 统计包含某关键词的记录数count_phone=df['产品名'].str.contains('手机',na=False).sum()# 多条件计数(COUNTIFS)count_multi=len(df[(df['地区']=='北京')&(df['金额']>10000)&(df['状态']=='已完成')])SUMIF:条件求和
# SUMIF:统计北京地区销售总额sum_bj=df[df['地区']=='北京']['金额'].sum()# SUMIFS:多条件求和sum_multi=df[(df['地区']=='北京')&(df['状态']=='已完成')&(df['金额']>1000)]['金额'].sum()# 按地区分组求和(相当于所有地区的SUMIF)region_sum=df.groupby('地区')['金额'].sum().reset_index()region_sum.columns=['地区','总金额']AVERAGEIF:条件平均
# AVERAGEIF:北京地区平均订单金额avg_bj=df[df['地区']=='北京']['金额'].mean()# 多条件平均avg_multi=df[(df['地区']=='北京')&(df['状态']=='已完成')]['金额'].mean()生成条件统计报表
defgenerate_summary_report(df,output_path):"""生成多维度条件统计报表"""withpd.ExcelWriter(output_path,engine='openpyxl')aswriter:# 1. 按地区统计region_stats=df.groupby('地区').agg(订单数=('订单ID','count'),总金额=('金额','sum'),平均金额=('金额','mean'),最大金额=('金额','max'),最小金额=('金额','min')).round(2).reset_index()region_stats.to_excel(writer,sheet_name='按地区统计',index=False)# 2. 按状态统计status_stats=df.groupby('状态').agg(订单数=('订单ID','count'),总金额=('金额','sum')).reset_index()status_stats.to_excel(writer,sheet_name='按状态统计',index=False)# 3. 按地区×状态交叉统计cross=pd.pivot_table(df,values='金额',index='地区',columns='状态',aggfunc='sum',fill_value=0,margins=True,margins_name='合计')cross.to_excel(writer,sheet_name='交叉统计')# 4. 条件筛选统计conditions={'大额订单(>1万)':df[df['金额']>10000],'小额订单(<1千)':df[df['金额']<1000],'北京已完成':df[(df['地区']=='北京')&(df['状态']=='已完成')],'上海待处理':df[(df['地区']=='上海')&(df['状态']=='待处理')],}summary_data=[]forname,subsetinconditions.items():summary_data.append({'统计项':name,'订单数':len(subset),'总金额':subset['金额'].sum(),'平均金额':round(subset['金额'].mean(),2)iflen(subset)>0else0})condition_df=pd.DataFrame(summary_data)condition_df.to_excel(writer,sheet_name='条件统计',index=False)returnoutput_path# 使用df=pd.read_excel(r"C:\Data\sales.xlsx")generate_summary_report(df,r"C:\Data\sales_summary.xlsx")动态条件统计
defdynamic_summary(df,group_col,value_col,conditions=None):""" 动态条件统计 conditions: dict of {条件名: 筛选条件函数} """# 基础分组统计result=df.groupby(group_col).agg(计数=(value_col,'count'),求和=(value_col,'sum'),平均=(value_col,'mean'),).round(2).reset_index()# 添加条件统计列ifconditions:forcond_name,cond_funcinconditions.items():cond_result=df[cond_func(df)].groupby(group_col)[value_col].sum()result[f'{cond_name}_金额']=result[group_col].map(cond_result).fillna(0)returnresult# 使用df=pd.read_excel(r"C:\Data\sales.xlsx")summary=dynamic_summary(df,group_col='地区',value_col='金额',conditions={'大额':lambdad:d['金额']>10000,'已完成':lambdad:d['状态']=='已完成',})写入Excel公式版本
importopenpyxldefwrite_sumif_formulas(file_path):"""在Excel中写入SUMIF/COUNTIF公式"""wb=openpyxl.load_workbook(file_path)ws_data=wb['销售数据']ws_summary=wb['统计']# 假设统计表中A列是地区名称,从第2行开始forrowinrange(2,ws_summary.max_row+1):region=ws_summary.cell(row=row,column=1).valueifnotregion:continue# COUNTIF:统计该地区订单数ws_summary.cell(row=row,column=2).value=\f'=COUNTIF(销售数据!B:B,A{row})'# SUMIF:统计该地区总金额ws_summary.cell(row=row,column=3).value=\f'=SUMIF(销售数据!B:B,A{row},销售数据!D:D)'# SUMIFS:该地区已完成订单总金额ws_summary.cell(row=row,column=4).value=\f'=SUMIFS(销售数据!D:D,销售数据!B:B,A{row},销售数据!E:E,"已完成")'wb.save(file_path)有什么坑
坑1:条件筛选时空值导致报错
金额列有空值,直接比较会报错或结果不对:
# 问题:空值比较df[df['金额']>1000]# NaN参与比较结果为False,不会报错但可能遗漏# 更安全:先处理空值df['金额']=pd.to_numeric(df['金额'],errors='coerce').fillna(0)result=df[df['金额']>1000]# 或者排除空值result=df[df['金额'].notna()&(df['金额']>1000)]坑2:groupby结果缺少某些分组
某些地区没有数据,groupby后结果里缺少该地区行:
TEMU店群矩阵自动化运营核价报活动
# 问题:只有北京和上海有数据,广州没有result=df.groupby('地区')['金额'].sum()# 结果只有北京和上海# 解决:用reindex补全all_regions=['北京','上海','广州','深圳']result=df.groupby('地区')['金额'].sum().reindex(all_regions,fill_value=0)坑3:SUMIF公式范围不匹配
写入Excel公式时,条件范围和求和范围行数不一致:
# 错误:条件范围是B列,求和范围是D2:D100ws.cell(row=row,column=3).value='=SUMIF(B:B,A2,D2:D100)'# 范围不一致# 正确:两个范围要一致ws.cell(row=row,column=3).value='=SUMIF(B:B,A2,D:D)'# 都是整列# 或ws.cell(row=row,column=3).value='=SUMIF(B2:B1000,A2,D2:D1000)'# 同范围坑4:浮点数精度问题
条件求和后金额出现0.00000001的偏差:
# 问题:浮点数精度total=df[df['地区']=='北京']['金额'].sum()# 可能是100000.00000000001# 解决:用roundtotal=round(df[df['地区']=='北京']['金额'].sum(),2)# 或用Decimal处理金额fromdecimalimportDecimal df['金额']=df['金额'].apply(lambdax:Decimal(str(x)))total=df[df['地区']=='北京']['金额'].sum()total=float(total)坑5:COUNTIF统计中文条件
统计包含中文字符的记录时,编码或全半角不一致导致漏统计:
# 问题:全角和半角括号不一致df['产品名'].str.contains('手机(智能)',na=False)# 只匹配全角括号# 解决:统一全半角后再匹配importunicodedata df['产品名']=df['产品名'].astype(str).apply(lambdax:unicodedata.normalize('NFKC',x))count=df['产品名'].str.contains('手机(智能)',na=False).sum()