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

如何使用Polars DataFrame排除JSON输出中的空值字段?

解决Polars处理BigQuery表输出无空值嵌套JSON的问题

直接上可行方案,核心思路是把每行数据转成Python字典后递归清理空值字段,再用原生JSON序列化输出,避开Polars Struct保留空字段和JSON转义的问题:

步骤1:定义递归清理空值的函数

这个函数会处理所有嵌套层级的字典、列表,去掉空值、空字典、空列表对应的字段/元素:

def clean_null_fields(data):
    if isinstance(data, dict):
        # 只保留值不为None、非空字典、非空列表的键
        return {
            k: clean_null_fields(v)
            for k, v in data.items()
            if v is not None and v != {} and v != []
        }
    elif isinstance(data, list):
        # 清理列表里的空元素,同时递归处理每个元素
        return [clean_null_fields(item) for item in data if item is not None]
    else:
        # 基础类型直接返回
        return data

步骤2:读取并处理数据

用Polars读取BigQuery表后,逐行转字典、清理空值,再输出无转义的JSON:

import polars as pl
import json

# 替换成你的BigQuery表路径
df = pl.read_bigquery("your-project.your-dataset.your-table")

# 输出到控制台(如果要存文件就用下方注释的文件写入逻辑)
for row in df.iter_rows(named=True):
    cleaned_row = clean_null_fields(row)
    # json.dumps直接序列化清理后的字典,无转义字符
    print(json.dumps(cleaned_row))

# 保存到JSON Lines文件的写法
# with open("output.jsonl", "w") as f:
#     for row in df.iter_rows(named=True):
#         cleaned_row = clean_null_fields(row)
#         f.write(json.dumps(cleaned_row) + "\n")

为什么这个方案能解决你的问题

  • 避开str.json_decode()的坑:Polars的Struct类型会因为其他行存在某个字段而保留所有行的该字段(哪怕是空值),直接用iter_rows(named=True)转成Python字典,就能灵活删除空值键。
  • 无转义JSON:用json.dumps()序列化原生Python字典,不会出现转义字符,比Polars自带的JSON输出更可控。
  • 全层级清理:递归函数能处理嵌套的Struct、List,不管多少层的空值字段都能去掉。

可选调整

  • 如果想保留空字典/空列表,把函数里的v != {} and v != []去掉就行,只保留v is not None。
  • 数据量极大时,iter_rows是逐行处理,内存占用低,适合大数据场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:01