首页 > 解决方案 > 从多个 JSON 文件构造 DataFrame

问题描述

我正在使用 pandas 将多个 json 文件转换为数据框。我只想要一些符合这些文件中某些条件的条目,但我要附加整个转换后的文件,然后过滤它。

假设我有 2 个如下所示的 json 文件:

文件 1500.json

[
  {
    "CodStore": 1500,
    "CodItem": 10,
    "NameItem": "Burger",
    "Price": 10.0
  },
  {
    "CodStore": 1500,
    "CodItem": 20,
    "NameItem": "Fries",
    "Price": 3.0
  },
  {
    "CodStore": 1500,
    "CodItem": 30,
    "NameItem": "Ice Cream",
    "Price": 1.0
  }
]

文件 1805.json

[
  {
    "CodStore": 1805,
    "CodItem": 10,
    "NameItem": "Burger",
    "Price": 9.0
  },
  {
    "CodStore": 1805,
    "CodItem": 20,
    "NameItem": "Fries",
    "Price": 2.0
  },
  {
    "CodStore": 1805,
    "CodItem": 30,
    "NameItem": "Ice Cream",
    "Price": 0.5
  }
]

我只希望我的数据框中包含 CodItem 10 和 30 的条目,所以我的 python 代码如下所示:

from pandas import DataFrame, read_json

df = DataFrame()

stores = [1500, 1805]

for store in stores:
    filename = '%s.json' % store
    df = df.append(read_json(filename))

df = df[(df.CodItem == 10) | (df.CodItem == 30)]

这只是一个例子,问题是我有超过 600 多个 json 文件,所以读取需要很多时间,数据帧变得很长,内存消耗非常高。

有没有办法只读取数据框的匹配条件?

标签: pythonpandas

解决方案


一种选择是将您的 JSON 数据附加到列表中,然后在最后转换一次并过滤。

coditems = [10, 30]

data = []
for filename in json_files:
    data.extend(read_json(filename))

df = pd.DataFrame(data).query('CodItem in @coditems')

这应该会快很多,因为append它是二次运算。无论如何你必须读取所有数据,所以你不妨使用熊猫来加速它。


另一种选择是在循环中初始化 DataFrame,然后pd.concat在完成后调用。

df_list = []
for file in json_files:
    df_list.append(pd.DataFrame.from_records(read_json(filename)))

df = pd.concat(df_list, ignore_index=True).query('CodItem in @coditems')

推荐阅读