You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerBI中用Python/Power Query M过滤邮政编码时数据全被过滤的问题

PowerBI邮政编码过滤问题修正方案

问题根源分析

Python脚本问题

  1. re.match仅匹配字符串开头,若编码含小写字母、前后有多余空格,会导致有效编码匹配失败
  2. 未处理空值,空值转字符串后被识别为"NaN",错误标记为无效
  3. 正则未锚定首尾,可能匹配到部分符合格式的无效内容

Power Query M代码问题

  1. Value.Is(Text.Start([OtherPostalCode], 4), type number)逻辑错误:Text.Start返回文本类型,永远无法匹配type number
  2. 未处理空值,调用Text.Start/Text.End会触发报错
  3. 替换值使用Null.Type而非null,不符合Table.ReplaceValue参数要求
  4. 未考虑带空格的编码格式(如"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:27:47