如何从Python Pandas Dataframe中的STRING列中提取嵌套字典



有一个表,其列event的一个数据点如下所示:

事件是字符串列!

df['event']
RETURNS:
"{'eventData': {'type': 'page', 'name': "WHAT'S UP"}, 'eventId': '1003', 'deviceType': 'kk', 'pageUrl': '/chick 2/whats sup', 'version': '1.0.0.888-10_7_2020__4_18_30', 'sessionGUID': '1b312346a-cd26-4ce6-888-f25143030e02', 'locationid': 'locakdi-3b0c-49e3-ab64-741f07fd4cb3', 'eventDescription': 'Page Load'}"

我试图从字典中提取嵌套的字典eventData,并创建一个新列,如下所示:

df['event'] 
RETURNS: 
{'eventId': '1003', 'deviceType': 'kk', 'pageUrl': '/chick 2/whats sup', 'version': '1.0.0.888-10_7_2020__4_18_30', 'sessionGUID': '1b312346a-cd26-4ce6-888-f25143030e02', 'locationid': 'locakdi-3b0c-49e3-ab64-741f07fd4cb3', 'eventDescription': 'Page Load'}
df['eventData']
RETURNS:
{'type': 'page', 'name': "WHAT'S UP"}

我该怎么做?

我会考虑在event列上使用pandas-apply方法。

如果eventData关键字预计存在于数据帧的所有行的event列字典中,则以下内容可能足以满足

import json
import numpy as np
def get_event_data_from_event(event_str):
"""
Convert event string to dict and return event_data
"""
try:
event_as_dict = json.loads(event_str)
except json.decoder.JSONDecodeError:
return np.nan
else
if not "eventData" in event_as_dict.keys():
return np.nan
return event_as_dict["eventData"]  
df["eventData"] = df["event"].apply(lambda x: get_event_data_from_event(x))

如果event字典的格式没有如您所期望的那样,它将返回eventData列中该行的N/A。

然后,您可以使用类似的dropna来删除那些不一致的行

df_subset = df.dropna(axis='columns', subset="eventData")

我终于从另一篇文章中找到了答案:Python扁平化多级/嵌套JSON

如何使用:json_col=pd.DataFrame([flatin_json(x(for x in df['json_column']](

def flatten_json(nested_json, exclude=['']):
out = {}
def flatten(x, name='', exclude=exclude):
if type(x) is dict:
for a in x:
if a not in exclude: flatten(x[a], name + a + '_')
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x
flatten(nested_json)
return out 

最新更新