如何使用带schema参数的Polars pl.read_json函数将指定JSON文件转换为Polars DataFrame
如何使用带schema参数的Polars pl.read_json函数将指定JSON文件转换为Polars DataFrame
嘿,我来帮你搞定这个问题!你的JSON结构是嵌套式的——data字段下包含了列名列表names和数据行数组ndarray,直接用pl.read_json读取的话,没法自动识别成标准的表格结构,不过结合schema参数和一些小技巧就能精准转换啦。
首先先明确你的JSON结构,方便我们后续处理:
{
"data": {
"names": ["A", "B", "C", "D", "E"],
"ndarray": [
["abc", true, 0.374618, 1, 0.83252],
["hello", false, 0.1265374619, 0, 0.253]
]
}
}
步骤1:定义自定义Schema
根据你的数据类型,我们先提前定义好每一列的类型(对应names里的A到E):
import polars as pl custom_schema = { "A": pl.String, # 对应第一列字符串 "B": pl.Boolean, # 第二列布尔值 "C": pl.Float64, # 第三列浮点数 "D": pl.Int64, # 第四列整数 "E": pl.Float64 # 第五列浮点数 }
步骤2:用pl.read_json结合Schema转换
这里有两种实用的方式,你可以选适合自己的:
方式一:先读取整个JSON,再提取数据并应用Schema
如果想先确认原始数据结构,这种方式更直观:
# 读取你的JSON文件(假设文件名为data.json) raw_df = pl.read_json("data.json") # 从raw数据中提取ndarray数组,转成DataFrame并指定schema final_df = pl.DataFrame( data=raw_df["data"]["ndarray"].to_list(), schema=custom_schema )
方式二:直接用json_path定位数据+Schema参数
这种方式更高效,一步到位——用JSONPath语法直接定位到data.ndarray,同时指定schema:
final_df = pl.read_json( "data.json", json_path="$.data.ndarray", # 定位到数据行数组 schema=custom_schema # 应用自定义类型约束 )
验证结果
打印final_df就能得到你想要的表格啦:
shape: (2, 5) ┌───────┬───────┬──────────────┬─────┬──────────┐ │ A ┆ B ┆ C ┆ D ┆ E │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ bool ┆ f64 ┆ i64 ┆ f64 │ ╞═══════╪═══════╪══════════════╪═════╪══════════╡ │ abc ┆ true ┆ 0.374618 ┆ 1 ┆ 0.83252 │ │ hello ┆ false ┆ 0.1265374619 ┆ 0 ┆ 0.253 │ └───────┴───────┴──────────────┴─────┴──────────┘
进阶:动态生成Schema(如果列名是动态的)
如果你的names字段是动态变化的,不想硬编码列名,可以先读取names来生成schema:
# 先读取列名列表 column_names = pl.read_json("data.json")["data"]["names"].to_list() # 对应每一列的类型(根据你的数据调整) column_types = [pl.String, pl.Boolean, pl.Float64, pl.Int64, pl.Float64] # 动态生成schema dynamic_schema = dict(zip(column_names, column_types)) # 再读取数据 final_df = pl.read_json( "data.json", json_path="$.data.ndarray", schema=dynamic_schema )
这样不管names怎么变,都能自动匹配列名和类型啦!
备注:内容来源于stack exchange,提问作者Carlitos Overflow
相关产品推荐
相关产品推荐

