我有一个 CSV,其中一个字段是嵌套的 JSON 对象,存储为字符串。我想将 CSV 加载到数据框中,并将 JSON 解析为附加到原始数据框的一组字段;换句话说,提取 JSON 的内容并使它们成为数据帧的一部分。
My CSV:
id|dist|json_request
1|67|{"loc":{"lat":45.7, "lon":38.9},"arrival": "Monday", "characteristics":{"body":{"color":"red", "make":"sedan"}, "manuf_year":2014}}
2|34|{"loc":{"lat":46.89, "lon":36.7},"arrival": "Tuesday", "characteristics":{"body":{"color":"blue", "make":"sedan"}, "manuf_year":2014}}
3|98|{"loc":{"lat":45.70, "lon":31.0}, "characteristics":{"body":{"color":"yellow"}, "manuf_year":2010}}
请注意,并非所有行的所有键都相同。
我希望它生成一个与此等效的数据框:
data = {'id' : [1, 2, 3],
'dist' : [67, 34, 98],
'loc_lat': [45.7, 46.89, 45.70],
'loc_lon': [38.9, 36.7, 31.0],
'arrival': ["Monday", "Tuesday", "NA"],
'characteristics_body_color':["red", "blue", "yellow"],
'characteristics_body_make':["sedan", "sedan", "NA"],
'characteristics_manuf_year':[2014, 2014, 2010]}
df = pd.DataFrame(data)
(我真的很抱歉,我无法让表格本身看起来很合理!请不要生我的气,我是一个菜鸟:()
我尝试过的
经过一番折腾后,我想出了以下解决方案:
#Import data
df_raw = pd.read_csv("sample.csv", delimiter="|")
#Parsing function
def parse_request(s):
sj = json.loads(s)
norm = json_normalize(sj)
return norm
#Create an empty dataframe to store results
parsed = pd.DataFrame(columns=['id'])
#Loop through and parse JSON in each row
for i in df_raw.json_request:
parsed = parsed.append(parse_request(i))
#Merge results back onto original dataframe
df_parsed = df_raw.join(parsed)
这显然不优雅而且效率很低(我必须解析 300K 行需要几个小时)。有没有更好的办法?
我看过的地方
我已经解决了以下相关问题:将 CSV 读入 pandas,其中一列是 json 字符串 https://stackoverflow.com/questions/20680272/reading-a-csv-into-pandas-where-one-column-is-a-json-string(这似乎只适用于简单的非嵌套 JSON)
JSON 到 pandas DataFrame https://stackoverflow.com/questions/21104592/json-to-pandas-dataframe(我从中借用了部分解决方案,但我无法弄清楚如何在数据帧中应用此解决方案而不循环遍历行)
我正在使用 Python 3.3 和 Pandas 0.17。