第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用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 關注
  • 538 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號