VBA读取单元格值至列表,按分组位置统计移动量技术求助
嗨,我来帮你搞定这个位置移动量统计的问题!下面给你两种实用方案,从基础列表遍历到更高效的工具都有,你可以根据自己的需求选:
方案一:基础Python列表遍历实现
如果你想坚持用列表来处理,核心是先把分组规则整理成可匹配的结构,再逐条判断记录归属:
1. 把分组规则转成可读取的结构
首先别用单纯的列表存分组,用字典更实用——能直接把分组名和对应的筛选条件绑定起来,后续维护也方便。举两个常见场景的例子:
场景1:按关键词匹配分组
比如你要把含“北”“东北”的位置归为「北区」,含“南”“西南”的归为「南区」,剩下的归「其他」:
# 键是分组名,值是该组的匹配关键词列表 group_rules = { "北区": ["北", "东北"], "南区": ["南", "西南"], "其他": [] # 兜底用的空列表,最后匹配 }
场景2:按复杂逻辑匹配(比如位置代码区间)
如果位置是数字代码,比如100-199算北区,200-299算南区,那可以用函数来定义规则:
def is_north(location): # 把位置转成数字后判断区间 return 100 <= int(location.strip()) <= 199 def is_south(location): return 200 <= int(location.strip()) <= 299 group_rules = { "北区": is_north, "南区": is_south, "其他": lambda x: True # 兜底,只要前面没匹配上就归这组 }
2. 读取原始移动记录到列表
假设你的数据存在CSV文件里,用基础Python就能读取:
import csv movement_records = [] # 打开CSV文件,跳过表头,把每行的位置和移动量存成元组 with open("你的移动记录.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) next(reader) # 跳过第一行表头 for row in reader: location = row[0].strip() # 去掉位置前后的空格 amount = float(row[1]) # 把移动量转成数字 movement_records.append((location, amount))
如果是Excel文件,可以用openpyxl库读取,逻辑类似——遍历工作表的行,把数据存到列表里即可。
3. 遍历记录匹配分组并统计
接下来初始化统计结果,然后逐条判断每条记录属于哪个分组,累加移动量:
# 先给每个分组初始化为0 group_stats = {group: 0.0 for group in group_rules.keys()} for location, amount in movement_records: matched = False # 遍历每个分组规则,找归属 for group, rule in group_rules.items(): if group == "其他": # 到最后兜底分组,直接加进去 group_stats[group] += amount matched = True break # 如果规则是关键词列表,检查位置是否包含任意关键词 if isinstance(rule, list): if any(keyword in location for keyword in rule): group_stats[group] += amount matched = True break # 如果规则是函数,直接调用函数判断 elif callable(rule): if rule(location): group_stats[group] += amount matched = True break # 最后打印统计结果 for group, total in group_stats.items(): print(f"{group} 总移动量: {total:.2f}")
方案二:用Pandas高效处理(更推荐!)
如果你的数据量比较大,或者以后还要做更多数据处理,用Pandas会省超多事——不用手动写遍历逻辑,几行代码就能搞定:
1. 读取数据并生成分组列
import pandas as pd # 读取CSV/Excel数据,假设列名是「位置」和「移动量」 df = pd.read_csv("你的移动记录.csv") # 如果是Excel就用 pd.read_excel("你的文件.xlsx") # 定义一个函数,输入位置返回对应的分组 def get_group(location): if "北" in location or "东北" in location: return "北区" elif "南" in location or "西南" in location: return "南区" else: return "其他" # 给数据新增一列「分组」,用apply函数批量生成 df["分组"] = df["位置"].apply(get_group)
如果是精确位置匹配分组(比如指定“北京”“沈阳”都归北区),可以先做个映射字典:
# 把每个位置对应的分组存成字典 location_group_map = { "北京": "北区", "沈阳": "北区", "广州": "南区", "成都": "南区", # 可以继续加更多位置... } # 用map函数批量匹配,找不到的归为「其他」 df["分组"] = df["位置"].map(location_group_map).fillna("其他")
2. 按分组统计移动量
这一步超简单,直接用groupby就能求和:
# 按分组对「移动量」求和,转成表格格式 group_stats = df.groupby("分组")["移动量"].sum().reset_index() # 打印结果 print(group_stats)
额外小技巧
如果你的分组规则是存在另一个Excel/CSV文件里的(比如第一列是位置/关键词,第二列是分组名),可以直接把规则文件读取成字典,不用硬编码到代码里:
# 读取分组规则文件 rule_df = pd.read_excel("分组规则表.xlsx") # 把规则转成字典:键是位置/关键词,值是分组名 location_group_map = dict(zip(rule_df["关键词"], rule_df["分组名"]))
这样以后分组规则变了,直接改规则表就行,不用改代码~
内容的提问来源于stack exchange,提问作者Dideki
相关产品推荐
相关产品推荐

