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

如何在Python中将数组结构体(Array Struct)的组件转换为列?

如何在Python中将数组结构体(Array Struct)的组件转换为列?

问题背景

我现在需要处理JSON数据源里的数组结构体列,想要把Tags列拆分,让每个Key成为单独的列,对应的Value填充到列中;如果某个条目没有对应的Tag,就填空值。有没有实现思路?感谢!

当前数据结构(JSON Lines格式):

{"Account ID": "101356", "AccountName": "Account1", "Tags": [{"Key": "AppGroupEmail", "Value": "testteam"}, {"Key": "SNOW", "Value": "TASK21002089571"}, {"Key": "ClientID", "Value": "220001"}]}
{"Account ID": "101357", "AccountName": "Account2", "Tags": [{"Key": "ClientID", "Value": "220007"}, {"Key": "BuildTicket", "Value": "TM21001412480"}, {"Key": "AccountType", "Value": "Dev"}]}

预期结果:

Account IDAccountNameAppGroupEmailSNOWClientIDBuildTicketAccountType
101356Account1testteamTASK21002089571220001
101357Account2220007TM21001412480Dev

解决方案

下面给你两种常用的实现方式,分别适配不同数据量场景:

方式一:用Pandas处理(小数据量友好)

Pandas操作直观,适合处理本地小文件,代码逻辑清晰易懂:

import pandas as pd

# 读取JSON Lines格式的文件(每行一个独立JSON对象)
df = pd.read_json("your_json_file.json", lines=True)

# 展开Tags数组,把每个Key-Value对拆成单独一行
exploded_df = df.explode("Tags", ignore_index=True)

# 把Tags里的字典结构拆成Key和Value两列
exploded_df[["Key", "Value"]] = pd.DataFrame(exploded_df["Tags"].tolist(), index=exploded_df.index)

# 透视转换:将Key转为列名,Value对应填充,同时保留账号基础信息
result_df = exploded_df.pivot(
    index=["Account ID", "AccountName"],
    columns="Key",
    values="Value"
).reset_index()

# 移除列名的层级标签,缺失值填充为空字符串
result_df.columns.name = None
result_df = result_df.fillna("")

# 查看最终结果
print(result_df)

运行后就能得到和预期完全一致的表格,缺失的字段会自动填充为空值。

方式二:用PySpark处理(大数据量场景)

如果你的数据量很大,用PySpark的分布式处理能力会更高效,适合大数据平台批量处理:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, col, pivot, first

# 初始化Spark会话
spark = SparkSession.builder.appName("UnnestTags").getOrCreate()

# 读取JSON Lines格式的数据
df = spark.read.json("your_json_file.json", multiLine=False)

# 展开Tags数组,每个Key-Value对生成一行数据
exploded_df = df.select("Account ID", "AccountName", explode("Tags").alias("tag"))

# 拆分tag字典为Key和Value两个独立列
split_df = exploded_df.select(
    "Account ID",
    "AccountName",
    col("tag.Key").alias("Key"),
    col("tag.Value").alias("Value")
)

# 透视转换:将Key转为列,用first函数取对应Value,缺失值填充为空字符串
result_df = split_df.groupBy("Account ID", "AccountName")\
                   .pivot("Key")\
                   .agg(first("Value"))\
                   .fillna("")

# 展示最终结果
result_df.show()

这个方法能轻松处理TB级别的数据,在分布式集群上运行效率极高。


备注:内容来源于stack exchange,提问作者user22672915

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:08:01