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

从PowerQuery迁移至Python时结果不一致的问题排查

排查Pandas生成DEP_PORT_CODE_FINAL列与PowerQuery结果不符的问题

以下是针对你遇到的<function <lambda>...>、多余0、缺失特定端口值等问题的具体排查方向及解决方法:

1. Lambda函数未正确执行,导致函数对象存入列中

  • 问题根源:你可能直接将lambda函数赋值给了列,而非调用它处理数据。例如错误写法:df['DEP_PORT_CODE_FINAL'] = lambda x: ...,正确的写法应该通过apply触发函数执行。
  • 修复方法:使用apply(逐行处理)或矢量化方法执行逻辑:
    # 逐行处理示例
    df['DEP_PORT_CODE_FINAL'] = df.apply(lambda x: x['ALT_DEP_PORT'] if pd.isna(x['DEP_PORT_CODE']) else x['DEP_PORT_CODE'], axis=1)
    # 更高效的矢量化写法
    df['DEP_PORT_CODE_FINAL'] = df['DEP_PORT_CODE'].where(df['DEP_PORT_CODE'].notna(), df['ALT_DEP_PORT'])
    

2. 条件判断逻辑与PowerQuery不一致,错误生成0值

  • 问题根源:PowerQuery中未匹配条件时可能返回原字段值或空值,但Python代码中错误设置为返回0。比如PowerQuery逻辑是if [DEP_PORT_CODE] = "" then [ALT_DEP_PORT] else [DEP_PORT_CODE],而Python代码误写为返回0。
  • 修复方法:逐行对比PowerQuery的M语言逻辑,修正条件分支。例如:
    # 修正为匹配PowerQuery的逻辑
    df['DEP_PORT_CODE_FINAL'] = df.apply(
        lambda x: x['ALT_DEP_PORT'] if x['DEP_PORT_CODE'].strip() == '' else x['DEP_PORT_CODE'],
        axis=1
    )
    

3. 字符串匹配/空值处理逻辑差异导致值缺失

  • 问题根源:
    • PowerQuery与Pandas对空值、空格字符串的判断规则不同(如PowerQuery区分""和null,Pandas中NaN、空字符串、空格字符串可能被混为一谈);
    • PowerQuery使用大小写不敏感匹配,而Python默认大小写敏感;
    • 遗漏PowerQuery中的前置过滤步骤,导致部分数据未进入处理流程。
  • 修复方法:
    • 统一空值处理:先清理字段中的空格和空字符串:
      df['DEP_PORT_CODE'] = df['DEP_PORT_CODE'].str.strip().replace('', pd.NA)
      df['ALT_DEP_PORT'] = df['ALT_DEP_PORT'].str.strip().replace('', pd.NA)
      
    • 启用大小写不敏感匹配:
      df['DEP_PORT_CODE_FINAL'] = df.apply(
          lambda x: x['ALT_DEP_PORT'] if x['DEP_PORT_CODE'].lower() == 'xxx' else x['DEP_PORT_CODE'],
          axis=1
      )
      
    • 核对PowerQuery的前置步骤,同步过滤逻辑(如保留特定航线、排除无效数据)。

4. 多CSV合并时数据丢失

  • 问题根源:合并文件时未正确使用追加逻辑(如误用merge而非concat),或部分文件未被读取,导致GIG、GRU等值所在的数据源未被纳入。
  • 修复方法:
    • 确认所有目标CSV文件都被读取:打印读取的文件路径列表,检查是否有遗漏;
    • 使用concat执行追加合并:
      import glob
      csv_files = glob.glob('path/to/*.csv')
      df_list = [pd.read_csv(f, dtype={'DEP_PORT_CODE': str, 'ALT_DEP_PORT': str}) for f in csv_files]
      merged_df = pd.concat(df_list, ignore_index=True)
      
    • 验证合并后总行数是否等于所有文件行数之和,确保无数据丢失。

5. 数据类型解析错误导致值丢失

  • 问题根源:读取CSV时,Pandas将包含字母的端口代码错误解析为数值类型,导致字符串值被转为NaN。
  • 修复方法:读取文件时强制指定字段为字符串类型:
    df = pd.read_csv('flight_data.csv', dtype={'DEP_PORT_CODE': str, 'ALT_DEP_PORT': str})
    

内容的提问来源于stack exchange,提问作者mjmoralesf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:12:42