猿问

Pandas Python 搜索 JSON 列表

我有一个 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 pd


items = pd.read_json('all_items.json')


# Do something to filter down the list

filtered_items = ?????


print(filtered_items.points.sum())

根据 Rob 的解决方案进行编辑:


#pipenv install pandas

# pandas = 1.1.0


import pandas as pd


items = pd.read_json('all_items.json')


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

给TypeError: string indices must be integers。


慕村9548890
浏览 164回答 3
3回答

慕虎7371278

您可以使用json_normalize:df = pd.io.json.json_normalize(s)print(df)    name  points                                       tags0  first     0.5           [{'key': 'Owner', 'value': 'A'}]1  first     1.5           [{'key': 'Owner', 'value': 'B'}]2  first    24.0  [{'key': 'SomeOtherTag', 'value': 'XYZ'}]# to filterfilter_mask = df['tags'].apply(lambda x: x[0]['value'] == 'A')df.loc[filter_mask, "points"].sum()

慕后森

如果您不严格使用 Pandas,另一种方法是对生成器理解求和,假设tags每行列表中只嵌入一个字典:sum(entry["points"] for entry in data if entry["tags"][0]["value"] == "A") 0.5

长风秋雁

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 jsonwith open('all_items.json') as f: items = json.load(f)pd.json_normalize(items, record_path="tags", meta=[['name'], ['points']])
随时随地看视频慕课网APP

相关分类

Python
我要回答