为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas Python 搜索 JSON 列表

Pandas Python 搜索 JSON 列表

慕村9548890 2023-05-09 09:33:19
我有一个 JSON 文件结构化列表,所以:[ {   "name": "first",   "points": 0.5,   "tags": [{      "key": "Owner",      "value": "A"   }] }, {   "name": "first",   "points": 1.5,   "tags": [{      "key": "Owner",      "value": "B"   }] }, {   "name": "first",   "points": 24,   "tags": [{      "key": "SomeOtherTag",      "value": "XYZ"   }] }]我想加载这个 JSON 数组,然后过滤特定key: value标签并计算points. 例如,过滤这个“主”列表,然后Owner: A计算应该给我结果的点数0.5我知道如何计算点数,items.points.sum()但我正在努力按标签键/值进行过滤。这是我到目前为止所拥有的:import pandas as pditems = pd.read_json('all_items.json')# Do something to filter down the listfiltered_items = ?????print(filtered_items.points.sum())根据 Rob 的解决方案进行编辑:#pipenv install pandas# pandas = 1.1.0import pandas as pditems = pd.read_json('all_items.json')pd.json_normalize(items, record_path="tags", meta=[['name'], ['points']])给TypeError: string indices must be integers。
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您可以使用json_normalize


df = pd.io.json.json_normalize(s)

print(df)


    name  points                                       tags

0  first     0.5           [{'key': 'Owner', 'value': 'A'}]

1  first     1.5           [{'key': 'Owner', 'value': 'B'}]

2  first    24.0  [{'key': 'SomeOtherTag', 'value': 'XYZ'}]


# to filter

filter_mask = df['tags'].apply(lambda x: x[0]['value'] == 'A')

df.loc[filter_mask, "points"].sum()


查看完整回答
反对 回复 2023-05-09
?
慕后森

TA贡献1802条经验 获得超5个赞

如果您不严格使用 Pandas,另一种方法是对生成器理解求和,假设tags每行列表中只嵌入一个字典:

sum(entry["points"] for entry in data if entry["tags"][0]["value"] == "A")
0.5


查看完整回答
反对 回复 2023-05-09
?
长风秋雁

TA贡献1757条经验 获得超7个赞

json_normalize()为你做这一切


js = [{'name': 'first', 'points': 0.5, 'tags': [{'key': 'Owner', 'value': 'A'}]},

 {'name': 'first', 'points': 1.5, 'tags': [{'key': 'Owner', 'value': 'B'}]},

 {'name': 'first',

  'points': 24,

  'tags': [{'key': 'SomeOtherTag', 'value': 'XYZ'}]}]



pd.json_normalize(js, record_path="tags", meta=[['name'], ['points']])


输出


          key value   name points

        Owner     A  first    0.5

        Owner     B  first    1.5

 SomeOtherTag   XYZ  first     24

补充更新

如果从文件中读取


import json

with open('all_items.json') as f: items = json.load(f)


pd.json_normalize(items, record_path="tags", meta=[['name'], ['points']])


查看完整回答
反对 回复 2023-05-09
  • 3 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信