拼接DataFrame与json_normalize结果时遇DataFrame构造调用错误
解决pandas拼接JSON字段时的ValueError问题
嘿,我来帮你搞定这个问题!你遇到的ValueError: DataFrame constructor not properly called!其实是个小问题——你把creation-date这个字符串直接赋值给了df,但pd.concat可不认单纯的字符串,它要的是pandas能处理的DataFrame或者Series才行。
咱们先拆解下你的代码问题:
- 首先,你用
record_path=['os-details']不太对,因为os-details是单个字典,不是数组列表,record_path本来是用来处理数组型嵌套字段的,这么写会让生成的DataFrame结构不符合预期。 - 其次,
creation-date是单个时间字符串,得把它转换成pandas的Series(或者单列DataFrame),才能和其他数据横向拼接。
下面是修正后的完整代码,我给你标了关键改动:
import pandas as pd import json from pandas.io.json import json_normalize # 读取JSON文件 with open("C:\\Users\\esrilka\\Documents\\jsonFiles\\jsonFiles\\Mynew.json") as fi: d = json.load(fi) # 直接normalize整个system-infos,pandas会自动展开所有嵌套字典(包括os-details、hw-details) works_data = json_normalize(data=d['system-infos']) # 把creation-date转成Series,指定列名,这样拼接时就会作为新列加入 creation_date_col = pd.Series([d['creation-date']], name='creation-date') # 横向拼接两个对象,axis=1代表按列拼接 result = pd.concat([works_data, creation_date_col], axis=1) # 保存到CSV result.to_csv("C:\\Users\\esrilka\\Documents\\jsonFiles\\sample.csv", index=False)
如果你就想单独提取os-details的内容,同时保留hostname、domain这些字段,可以用下面的写法,手动指定要提取的嵌套字段和关联的元数据:
import pandas as pd import json from pandas.io.json import json_normalize with open("C:\\Users\\esrilka\\Documents\\jsonFiles\\jsonFiles\\Mynew.json") as fi: d = json.load(fi) # 把os-details包装成数组,让record_path能识别,同时指定要保留的其他字段 works_data = json_normalize( data=d['system-infos'], record_path=[['os-details']], # 这里用双层列表确保识别单个字典 meta=['hostname', 'domain', 'cpu-count', 'cpu-name'] ) creation_date_col = pd.Series([d['creation-date']], name='creation-date') result = pd.concat([works_data, creation_date_col], axis=1) result.to_csv("C:\\Users\\esrilka\\Documents\\jsonFiles\\sample.csv", index=False)
这样改完之后,就能顺利完成拼接并导出CSV啦!
内容的提问来源于stack exchange,提问作者sri lakshmi
相关产品推荐
相关产品推荐

