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

Python:如何将特定键对应数组的结构转换为目标对象数组?

问题:转换SAS数据读取后的JSON输出格式

使用pyreadstat库的read_sas7bdat函数读取sas7bdat文件,该函数返回(DataFrame, 元数据)的元组。当前执行代码如下:

df = pyreadstat.read_sas7bdat(FILE_LOC, row_offset=START_FROM_ROW, row_limit=PAGE_SIZE)
finalList = []
for key in df[0]:
    l = list(map(lambda x: str(x) if str(x) == "nan" else x, df[0][key].tolist()))
    nparray = {key: l}
    finalList.append(nparray)
return json.dumps(finalList)

当前得到的输出为:

[
    {
        "fruits": [
            "banana",
            "apple",
            "oranges",
            "kiwi",
            "pineapple"
        ]
    },
    {
        "calories": [
            "10",
            "20",
            "10",
            "15",
            "60"
        ]
    }
]

期望转换为如下按行组织的格式:

[
    {
        "fruits": "banana",
        "calories": "10"
    },
    {
        "fruits": "apple",
        "calories": "20"
    },
    {
        "fruits": "oranges",
        "calories": "10"
    },
    {
        "fruits": "kiwi",
        "calories": "15"
    },
    {
        "fruits": "pineapple",
        "calories": "60"
    }
]

已知读取后返回的结构为:

(  fruits calories
0  banana   10
1  apple   20, <pyreadstat._readstat_parser.metadata_container object at 0x7f2e38f5f100>)

解决方案

核心问题在于原代码按列遍历构造数据,而我们需要按行组织每个对象。以下是两种实现方式:

方法一:简洁版(利用DataFrame内置方法)

import json
import pandas as pd
import pyreadstat

# 读取数据,解构出DataFrame和元数据
df, metadata = pyreadstat.read_sas7bdat(FILE_LOC, row_offset=START_FROM_ROW, row_limit=PAGE_SIZE)

# 处理缺失值:将NaN转为字符串"nan",其余值转为字符串(匹配原代码输出类型)
processed_df = df.applymap(lambda x: "nan" if pd.isna(x) else str(x))

# 直接转为按行的字典列表
final_list = processed_df.to_dict("records")

# 返回格式化后的JSON字符串
return json.dumps(final_list, indent=4)

方法二:手动遍历行(更直观)

如果需要精细控制每一行的处理逻辑,可以手动遍历构造:

import json
import pandas as pd
import pyreadstat

df, metadata = pyreadstat.read_sas7bdat(FILE_LOC, row_offset=START_FROM_ROW, row_limit=PAGE_SIZE)
final_list = []

# 遍历DataFrame的每一行
for _, row in df.iterrows():
    row_dict = {}
    for col_name, value in row.items():
        # 用pd.isna()准确判断缺失值,避免字符串"nan"的误判
        if pd.isna(value):
            row_dict[col_name] = "nan"
        else:
            row_dict[col_name] = str(value)
    final_list.append(row_dict)

return json.dumps(final_list, indent=4)

关键说明

  1. 解构返回值:明确拆分read_sas7bdat返回的元组,避免用df[0]的索引方式,代码可读性更强。
  2. 按行组织数据:to_dict("records")是Pandas内置的快捷方法,直接将DataFrame转换为每行对应一个字典的列表,无需手动遍历列。
  3. 缺失值处理:原代码用str(x) == "nan"判断缺失值存在误判风险,改用pd.isna()能准确识别Pandas中的各类缺失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:01:03