PowerBI中用Python/Power Query M过滤邮政编码时数据全被过滤的问题
PowerBI邮政编码过滤问题修正方案
问题根源分析
Python脚本问题
re.match仅匹配字符串开头,若编码含小写字母、前后有多余空格,会导致有效编码匹配失败- 未处理空值,空值转字符串后被识别为"NaN",错误标记为无效
- 正则未锚定首尾,可能匹配到部分符合格式的无效内容
Power Query M代码问题
Value.Is(Text.Start([OtherPostalCode], 4), type number)逻辑错误:Text.Start返回文本类型,永远无法匹配type number- 未处理空值,调用
Text.Start/Text.End会触发报错 - 替换值使用
Null.Type而非null,不符合Table.ReplaceValue参数要求 - 未考虑带空格的编码格式(如"0000 AA"长度为7,手动截取前后字符会失效)
修正后的代码
1. Python脚本
import pandas as pd import re # 匹配4位数字+可选空格+2位大小写字母,锚定首尾确保完全匹配 pattern = r"^\d{4}\s?[A-Za-z]{2}$" def validate_postal_code(postal_code): # 保留原始空值 if pd.isna(postal_code): return postal_code # 完全匹配则返回原编码,否则返回None if re.fullmatch(pattern, str(postal_code)): return postal_code else: return None dataset["OtherPostalCode"] = dataset["OtherPostalCode"].apply(validate_postal_code) print(dataset)
2. Power Query M代码
#"Filtered Valid Postal Codes" = Table.TransformColumns( #"Removed Other Columns", { {"OtherPostalCode", each // 保留空值 if _ = null then null // 正则匹配有效格式:4位数字+可选空格+2位大小写字母 else if Text.RegexMatch(_, "^(\d{4}\s?[A-Za-z]{2})$") then _ else null, type text} } ) in #"Filtered Valid Postal Codes"
关键修正说明
- Python:用
re.fullmatch确保整个字符串符合格式,添加空值判断保留原始空值,正则支持大小写字母和可选空格 - M代码:改用
Text.RegexMatch直接匹配正则规则,先处理空值避免报错,替换值使用null而非类型常量,覆盖两种格式的有效编码
内容的提问来源于stack exchange,提问作者Manouk
相关产品推荐
相关产品推荐

