请在这里帮助我阅读以下 json 并将其转换为数据帧。这包含多个 json 对象,我想将每个数组存储为单独的数据帧。
with open(r"C:\filelocation\file.json","rb") 作为 read_file: 数据 = json.load(read_file)
上面的代码给了我一个完整的数据帧,我需要将每个数组存储为一个数据帧。 下面是我试图转换为数据帧的 json
{ "q1": "a1", "q2": "a2", "q3": "a3", "q4": "a4", "q5": "a5", "q6": "a6", “细节”: [{ "q7": "a7", "q8": "a8", "q9": "a9", "q10": "a10", “q11”:[] }, { "q7": "a11", "q8": "a12", "q9": "a13", "q10": "a14", “q11”:[] }, { "q7": "a15", "q8": "a16", "q9": "a17", "q10": "a18", “q11”:[] }, { "q7": "a19", "q8": "a20", "q9": "a21", "q10": "a22", “q11”:[] }] }
答案 0 :(得分:1)
你可以试试这个方法。
import pandas as pd
import flatten_json
from flatten_json import flatten
d = { "q1": "a1", "q2": "a2", "q3": "a3", "q4": "a4", "q5": "a5", "q6": "a6", "Details": [{ "q7": "a7", "q8": "a8", "q9": "a9", "q10": "a10", "q11": [] }, { "q7": "a11", "q8": "a12", "q9": "a13", "q10": "a14", "q11": [] }, { "q7": "a15", "q8": "a16", "q9": "a17", "q10": "a18", "q11": [] }, { "q7": "a19", "q8": "a20", "q9": "a21", "q10": "a22", "q11": [] }] }
先创建一个df
df = pd.json_normalize(d)
给出:
q1 q2 q3 q4 q5 q6 Details
0 a1 a2 a3 a4 a5 a6 [{'q7': 'a7', 'q8': 'a8', 'q9': 'a9', 'q10': '...
并定义如下函数
def flatten_nested_json_df(df):
df = df.reset_index()
s = (df.applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df.applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
while len(list_columns) > 0 or len(dict_columns) > 0:
new_columns = []
for col in dict_columns:
horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
horiz_exploded.index = df.index
df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
new_columns.extend(horiz_exploded.columns) # inplace
for col in list_columns:
df = df.drop(columns=[col]).join(df[col].explode().to_frame())
new_columns.append(col)
s = (df[new_columns].applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df[new_columns].applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
return df
最后,压平 df:
print(flatten_nested_json_df(df))
返回:
index q1 q2 q3 q4 q5 q6 Details.q7 Details.q8 Details.q9 Details.q10 \
0 0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
0 0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
0 0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
0 0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
0 0 a1 a2 a3 a4 a5 a6 a11 a12 a13 a14
0 0 a1 a2 a3 a4 a5 a6 a11 a12 a13 a14
0 0 a1 a2 a3 a4 a5 a6 a11 a12 a13 a14
0 0 a1 a2 a3 a4 a5 a6 a11 a12 a13 a14
0 0 a1 a2 a3 a4 a5 a6 a15 a16 a17 a18
0 0 a1 a2 a3 a4 a5 a6 a15 a16 a17 a18
0 0 a1 a2 a3 a4 a5 a6 a15 a16 a17 a18
0 0 a1 a2 a3 a4 a5 a6 a15 a16 a17 a18
0 0 a1 a2 a3 a4 a5 a6 a19 a20 a21 a22
0 0 a1 a2 a3 a4 a5 a6 a19 a20 a21 a22
0 0 a1 a2 a3 a4 a5 a6 a19 a20 a21 a22
0 0 a1 a2 a3 a4 a5 a6 a19 a20 a21 a22
Details.q11
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
0 NaN
答案 1 :(得分:1)
IIUC,你可以试试:
df = pd.json_normalize(
json_data, meta=['q1', 'q2', 'q3', 'q4', 'q5', 'q6'], record_path='Details')