从多个JSON文件构造DataFrame

时间:2019-06-06 15:14:02

标签: python pandas

我正在使用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文件,因此读取需要大量时间,数据帧变得很长,内存消耗也很高。

是否有一种方法只能读取与数据框匹配的条件?

2 个答案:

答案 0 :(得分:1)

一种选择是将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')

答案 1 :(得分:0)

您可以在循环中创建一个临时数据帧,并在添加之前对其进行过滤:

from pandas import DataFrame, read_json

df = DataFrame()

stores = [1500, 1805]

for store in stores:
    filename = '%s.json' % store
    temp_df = read_json(filename)
    df = df.append(temp_df[(temp_df.CodItem == 10) | (temp_df.CodItem == 30)])