使用Pandas在大型CSV中解析带有嵌套值的JSON列

我有一个巨大的CSV文件(3.5GB,并且每天都会越来越大),该文件具有正常值和一个名为“元数据”的列,其中包含嵌套的JSON值。我的脚本如下,其目的只是将其每个键值对的JSON列转换为普通列。我正在使用Python3(Anaconda; Windows)。


import pandas as pd

import numpy as np

import csv

import datetime as dt


from pandas.io.json import json_normalize


for df in pd.read_csv("source.csv", engine='c', 

    dayfirst=True, 

    encoding='utf-8', 

    header=0,

    nrows=10,

    chunksize=2,

    converters={'Metadata':json.loads}):


    ## parsing code comes here


    with open("output.csv", 'a', encoding='utf-8') as ofile:

        df.to_csv(ofile, index=False, encoding='utf-8')

并且该列具有以下格式的JSON:


{  

   "content_id":"xxxx",

   "parental":"F",

   "my_custom_data":{  

      "GroupId":"NA",

      "group":null,

      "userGuid":"xxxxxxxxxxxxxx",

      "deviceGuid":"xxxxxxxxxxxxx",

      "connType":"WIFI",

      "channelName":"VOD",

      "assetId":"xxxxxxxxxxxxx",

      "GroupName":"NA",

      "playType":"VOD",

      "appVersion":"2.1.0",

      "userEnvironmentContext":"",

      "vodEncode":"H.264",

      "language":"English"

   }

}

期望的输出是将所有上述键值对作为列。数据框将具有其他非JSON列,我需要向其中添加从上述JSON解析的列。我尝试过,json_normalize但不确定如何应用json_normalize到Series对象,然后将其转换(或分解)为多列。


慕田峪9158850
浏览 448回答 1
1回答

函数式编程

只需json_normalize()直接在系列上使用,然后pandas.concat()将新数据框与现有数据框合并即可:pd.concat([df, json_normalize(df['Metadata'])]).drop('Metadata', axis=1)如果您不再需要带有JSON数据结构的旧列,则可以添加一个。为my_custom_data嵌套字典生成的列将带有my_custom_data.前缀。如果所有的名字在该嵌套的字典中是唯一的,你可以放下一个前缀DataFrame.rename()操作:json_normalize(df['Metadata']).rename(    columns=lambda n: n[15:] if n.startswith('my_custom_data.') else n)如果您正在使用其他方法将每个字典值转换为扁平化的结构(例如,使用flatten_json,那么您要使用Series.apply()来处理每个值,然后将每个结果字典作为pandas.Series()对象返回:def some_conversion_function(dictionary):    result = something_that_processes_dictionary_into_a_flat_dict(dictionary)    return pd.Series(something_that_processes_dictionary_into_a_flat_dict)然后,您可以将Series.apply()调用结果(将是一个数据帧)连接回原始数据帧:pd.concat([df, df['Metadata'].apply(some_conversion_function)])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python