将多个Json对象组合为Python Pandas中的一个DataFrame

时间:2014-01-19 15:43:30

标签: python json pandas

我不确定我在这里缺少什么,但我有2个包含json文件的zip文件,我只是想把我从文件中提取的数据组合起来并组合成一个数据帧,但我的循环一直给我单独的记录。这是我在构建DF之前所拥有的。我尝试了pd.concat,但我认为我的问题更多地与我首先阅读文件的方式有关。

data = []
for FileZips in glob.glob('*.zip'):
    with zipfile.ZipFile(FileZips, 'r') as myzip:
        for logfile in myzip.namelist():
            with myzip.open(logfile) as f:
                contents = f.readlines()[-2]
                jfile = json.loads(contents)
                print len(jfile)

返回:

40935 
40935

2 个答案:

答案 0 :(得分:2)

通过对我的缩进进行小调整,我能够得到我需要的东西!!

dfs = []
for FileZips in glob.glob('*.zip'):
    with zipfile.ZipFile(FileZips, 'r') as myzip:
        for logfile in myzip.namelist():
            with myzip.open(logfile, 'r') as f:
                contents = f.readlines()[-2]
                jfile = json.loads(contents)
                dfs.append(pd.DataFrame(jfile))
                df = pd.concat(dfs, ignore_index=True)
print len(df) 

答案 1 :(得分:2)

您可以使用read_json(假设它有效 json)。

我还会将其分解为更多可读性函数:

def zip_to_df(zip_file):
    with zipfile.ZipFile(zip_file, 'r') as myzip:
        return pd.concat((log_as_df(loglife, myzip)
                             for logfile in myzip.namelist()),
                         ignore_index=True)

def log_as_df(logfile, myzip):
    with myzip.open(logfile, 'r') as f:
        contents = f.readlines()[-2]
        return pd.read_json(contents)

df = pd.concat(map(zip_to_df, glob.glob('*.zip')), ignore_index=True)

注意:这会有更多的结论,但我认为它的可读性是值得的,你只能做一个连续...