为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2021-03-31 09:11:42
我有一个巨大的CSV文件(3.5GB,并且每天都会越来越大),该文件具有正常值和一个名为“元数据”的列,其中包含嵌套的JSON值。我的脚本如下,其目的只是将其每个键值对的JSON列转换为普通列。我正在使用Python3(Anaconda; Windows)。import pandas as pdimport numpy as npimport csvimport datetime as dtfrom pandas.io.json import json_normalizefor 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对象,然后将其转换(或分解)为多列。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

只需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)])


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 447 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信