我正在使用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文件,因此读取需要大量时间,数据帧变得很长,内存消耗也很高。
是否有一种方法只能读取与数据框匹配的条件?
答案 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)])