one*_*tap 15 python json dataframe pandas
我很难将多行分隔的 JSON 文件加载到单个 Pandas 数据帧中。这是我正在使用的代码:
import os, json
import pandas as pd
import numpy as np
import glob
pd.set_option('display.max_columns', None)
temp = pd.DataFrame()
path_to_json = '/Users/XXX/Desktop/Facebook Data/*'
json_pattern = os.path.join(path_to_json,'*.json')
file_list = glob.glob(json_pattern)
for file in file_list:
data = pd.read_json(file, lines=True)
temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)
当我查看时,似乎所有文件都在加载file_list
,但无法弄清楚如何将每个文件放入数据帧中。大约有 50 个文件,每个文件中有几行。
Jua*_*vez 21
将最后一行更改为:
temp = temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)
我们必须这样做的原因是因为附加没有发生。append 方法不会修改数据框。它只是返回一个带有追加操作结果的新数据帧。
自从写了这个答案后,我了解到你不应该DataFrame.append
在循环内使用,因为它会导致二次复制(见这个答案)。
您应该做的是首先创建一个数据框列表,然后使用pd.concat
单个操作将它们全部连接起来。像这样:
temp = temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)
这种替代方法应该快得多。
from pathlib import Path
import pandas as pd
paths = Path("/home/data").glob("*.json")
df = pd.DataFrame([pd.read_json(p, typ="series") for p in paths])
Run Code Online (Sandbox Code Playgroud)
如果您需要展平 JSON,Juan Estevez\xe2\x80\x99s 方法不会\xe2\x80\x99s 按原样工作。这是一个替代方案\xe2\x80\xaf:
\nimport pandas as pd\n\ndfs = []\nfor file in file_list:\n with open(file) as f:\n json_data = pd.json_normalize(json.loads(f.read()))\n dfs.append(json_data)\ndf = pd.concat(dfs, sort=False) # or sort=True depending on your needs\n
Run Code Online (Sandbox Code Playgroud)\n或者,如果您的 JSON 是行分隔的(未测试)\xe2\x80\xaf:
\nimport pandas as pd\n\ndfs = []\nfor file in file_list:\n with open(file) as f:\n for line in f.readlines():\n json_data = pd.json_normalize(json.loads(line))\n dfs.append(json_data)\ndf = pd.concat(dfs, sort=False) # or sort=True depending on your needs\n
Run Code Online (Sandbox Code Playgroud)\n