gpt4 book ai didi

python - 在 Pandas 数据框中展平嵌套的Json

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:23 24 4
gpt4 key购买 nike

我正在尝试将 json 文件加载到 pandas 数据框。我发现有一些嵌套的json。以下是示例 json:

{'events': [{'id': 142896214,
'playerId': 37831,
'teamId': 3157,
'matchId': 2214569,
'matchPeriod': '1H',
'eventSec': 0.8935539999999946,
'eventId': 8,
'eventName': 'Pass',
'subEventId': 85,
'subEventName': 'Simple pass',
'positions': [{'x': 51, 'y': 49}, {'x': 40, 'y': 53}],
'tags': [{'id': 1801, 'tag': {'label': 'accurate'}}]}

我使用以下代码将 json 加载到数据框中:

with open('EVENTS.json') as f:
jsonstr = json.load(f)

df = pd.io.json.json_normalize(jsonstr['events'])

下面是df.head()的输出

output of df

Here is the output

但我发现了两个嵌套的列,例如位置和标签。

我尝试使用以下代码来展平它:

Position_data = json_normalize(data =jsonstr['events'], record_path='positions', meta = ['x','y','x','y'] )

它向我显示如下错误:

KeyError: "Try running with errors='ignore' as key 'x' is not always present"

你能告诉我如何展平位置和标签(那些有嵌套数据的)吗?

谢谢,泽普

最佳答案

如果您正在寻找一种更通用的方法来从 json 中展开多个层次结构,您可以使用 recursion 和列表理解来 reshape 您的数据。下面介绍了一种替代方法:

def flatten_json(nested_json, exclude=['']):
"""Flatten json object with nested keys into a single level.
Args:
nested_json: A nested json object.
exclude: Keys to exclude from output.
Returns:
The flattened json object if successful, None otherwise.
"""
out = {}

def flatten(x, name='', exclude=exclude):
if type(x) is dict:
for a in x:
if a not in exclude: flatten(x[a], name + a + '_')
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x

flatten(nested_json)
return out

然后您可以独立于嵌套级别应用于您的数据:

新样本数据

this_dict = {'events': [
{'id': 142896214,
'playerId': 37831,
'teamId': 3157,
'matchId': 2214569,
'matchPeriod': '1H',
'eventSec': 0.8935539999999946,
'eventId': 8,
'eventName': 'Pass',
'subEventId': 85,
'subEventName': 'Simple pass',
'positions': [{'x': 51, 'y': 49}, {'x': 40, 'y': 53}],
'tags': [{'id': 1801, 'tag': {'label': 'accurate'}}]},
{'id': 142896214,
'playerId': 37831,
'teamId': 3157,
'matchId': 2214569,
'matchPeriod': '1H',
'eventSec': 0.8935539999999946,
'eventId': 8,
'eventName': 'Pass',
'subEventId': 85,
'subEventName': 'Simple pass',
'positions': [{'x': 51, 'y': 49}, {'x': 40, 'y': 53},{'x': 51, 'y': 49}],
'tags': [{'id': 1801, 'tag': {'label': 'accurate'}}]}
]}

用法

pd.DataFrame([flatten_json(x) for x in this_dict['events']])

Out[1]:
id playerId teamId matchId matchPeriod eventSec eventId \
0 142896214 37831 3157 2214569 1H 0.893554 8
1 142896214 37831 3157 2214569 1H 0.893554 8

eventName subEventId subEventName positions_0_x positions_0_y \
0 Pass 85 Simple pass 51 49
1 Pass 85 Simple pass 51 49

positions_1_x positions_1_y tags_0_id tags_0_tag_label positions_2_x \
0 40 53 1801 accurate NaN
1 40 53 1801 accurate 51.0

positions_2_y
0 NaN
1 49.0

请注意,此 flatten_json 代码不是我的,我在 herehere 中看到过它,但不确定其原始来源。

关于python - 在 Pandas 数据框中展平嵌套的Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52795561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com