Pandas JSON 规范化 - 选择正确的记录路径
Pandas JSON Normalize - Choose Correct Record Path
我正在尝试弄清楚如何规范化下面采样的嵌套 JSON 响应。
现在,json_normalize(res,record_path=['data'])
提供了我需要的大部分数据,但我真正想要的是“session_pageviews”list/dict 中的详细信息以及包含数据 list/dic。
我试过 json_normalize(res,record_path=['data', ['session_pageviews']], meta = ['data'])
但我收到错误消息:ValueError: operands could not be broadcast together with shape (32400,) (180,)
我也试过 json_normalize(res,record_path=['data'], max_level = 1)
但那并没有解除嵌套 session_pageviews
如有任何帮助,我们将不胜感激!
您可以尝试将以下功能应用于您的json:
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:
#print(f"exploding: {col}")
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
通过这样做:
df1= flatten_nested_json_df(df)
哪里
df = pd.json_normalize(json)
这应该会为您提供 json 中包含的所有信息。
我正在尝试弄清楚如何规范化下面采样的嵌套 JSON 响应。
现在,json_normalize(res,record_path=['data'])
提供了我需要的大部分数据,但我真正想要的是“session_pageviews”list/dict 中的详细信息以及包含数据 list/dic。
我试过 json_normalize(res,record_path=['data', ['session_pageviews']], meta = ['data'])
但我收到错误消息:ValueError: operands could not be broadcast together with shape (32400,) (180,)
我也试过 json_normalize(res,record_path=['data'], max_level = 1)
但那并没有解除嵌套 session_pageviews
如有任何帮助,我们将不胜感激!
您可以尝试将以下功能应用于您的json:
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:
#print(f"exploding: {col}")
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
通过这样做:
df1= flatten_nested_json_df(df)
哪里
df = pd.json_normalize(json)
这应该会为您提供 json 中包含的所有信息。