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)
关键说明
- 解构返回值:明确拆分
read_sas7bdat返回的元组,避免用df[0]的索引方式,代码可读性更强。 - 按行组织数据:
to_dict("records")是Pandas内置的快捷方法,直接将DataFrame转换为每行对应一个字典的列表,无需手动遍历列。 - 缺失值处理:原代码用
str(x) == "nan"判断缺失值存在误判风险,改用pd.isna()能准确识别Pandas中的各类缺失值。
内容的提问来源于stack exchange,提问作者Puneet Mehta
相关产品推荐
相关产品推荐

