Openpyxl与Pandas:Excel数据读取及统计查询方案推荐
高效实现方案推荐
一、核心工具选择
直接用Pandas处理,它在批量数据统计、分组计算上的效率远高于openpyxl,刚好你已了解该工具,无需额外学习新库。
二、完整实现步骤
1. 安装依赖(未安装时执行)
pip install pandas openpyxl
(Pandas读取xlsx文件需要openpyxl作为引擎,和你已掌握的工具兼容)
2. 读取Excel指定列数据
import pandas as pd # 仅读取需要的两列,减少内存占用提升效率 df = pd.read_excel("你的文件路径.xlsx", usecols=["Thickness(mm)", "Weight(KG)"]) # 简化列名方便后续操作 df.columns = ["Thickness", "Weight"]
3. 分组统计生成目标结果表
# 按Thickness分组,计算总重量和包裹数量 grouped_data = df.groupby("Thickness").agg( Weight=("Weight", "sum"), Parcels=("Thickness", "count") ).reset_index() # 将包裹数字段格式化为"X Parcels"样式 grouped_data["Parcels"] = grouped_data["Parcels"].apply(lambda x: f"{x} Parcels") # 生成总计行 total_row = pd.DataFrame({ "Thickness": ["TOTAL:"], "Weight": [df["Weight"].sum()], "Parcels": [f"{len(df)} Parcels"] }) # 合并统计结果与总计行 final_result = pd.concat([grouped_data, total_row], ignore_index=True) # 打印结果或保存到Excel print(final_result.to_string(index=False)) # final_result.to_excel("统计结果.xlsx", index=False)
运行后即可得到你需要的示例格式输出。
4. 实现查询功能
单个Thickness值查询
def query_single_thickness(target_thick): result = grouped_data[grouped_data["Thickness"] == target_thick] if not result.empty: print(result.to_string(index=False)) else: print(f"未找到厚度为{target_thick}的数据") # 调用示例 query_single_thickness(0.12)
厚度范围查询
def query_thickness_range(min_thick, max_thick): filtered_data = grouped_data[(grouped_data["Thickness"] >= min_thick) & (grouped_data["Thickness"] <= max_thick)] if not filtered_data.empty: # 计算范围内的总计值 range_total_weight = filtered_data["Weight"].sum() range_total_parcels = sum(int(item.split()[0]) for item in filtered_data["Parcels"]) range_total_row = pd.DataFrame({ "Thickness": ["RANGE TOTAL:"], "Weight": [range_total_weight], "Parcels": [f"{range_total_parcels} Parcels"] }) range_result = pd.concat([filtered_data, range_total_row], ignore_index=True) print(range_result.to_string(index=False)) else: print(f"未找到厚度在{min_thick}-{max_thick}之间的数据") # 调用示例 query_thickness_range(0.12, 0.14)
5. 交互式查询(可选)
如果需要让用户手动输入查询条件:
while True: print("\n查询选项:") print("1. 单个厚度值查询") print("2. 厚度范围查询") print("3. 退出") choice = input("输入选项编号:") if choice == "1": target = float(input("输入要查询的厚度值:")) query_single_thickness(target) elif choice == "2": min_t = float(input("输入最小厚度:")) max_t = float(input("输入最大厚度:")) query_thickness_range(min_t, max_t) elif choice == "3": print("程序退出") break else: print("无效选项,请重新输入")
三、方案优势
- 高效:Pandas的分组聚合基于底层优化,比openpyxl逐行处理快数十倍,数据量越大优势越明显
- 简洁:核心统计逻辑仅需几行代码,可读性强
- 扩展性好:后续如需添加平均值等其他统计维度,直接修改
agg方法的参数即可
内容的提问来源于stack exchange,提问作者Code-Killer
相关产品推荐
相关产品推荐

