如何从Python数据框架中的字符串列中提取嵌套字典?

如何从Python数据框架中的字符串列中提取嵌套字典?,python,regex,pandas,dataframe,re,Python,Regex,Pandas,Dataframe,Re,在一个表中,其列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', 'sessionG

在一个表中,其列
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"}
如何做到这一点?

我将研究如何使用
事件
列中的方法

如果数据帧的所有行的
eventData
键都应该出现在
event
列字典中,那么下面的内容就足够了

导入json
将numpy作为np导入
def从事件(事件)获取事件数据:
"""
将事件字符串转换为dict并返回事件数据
"""
尝试:
event_as_dict=json.load(event_str)
除了json.decoder.JSONDecodeError:
返回np.nan
其他的
如果事件“”中不是“eventData”,则为“”dict.keys():
返回np.nan
返回事件作为dict[“eventData”]
df[“eventData”]=df[“event”]。应用(lambda x:从事件(x)获取事件数据)
如果
事件
字典的格式与您预期的不一样,则它将在
事件数据
列中为该行返回N/A

然后,您可以删除那些不符合要求的行,如下所示:

df_subset=df.dropna(axis='columns',subset=“eventData”)
我将研究如何使用
事件
列中的方法

如果数据帧的所有行的
eventData
键都应该出现在
event
列字典中,那么下面的内容就足够了

导入json
将numpy作为np导入
def从事件(事件)获取事件数据:
"""
将事件字符串转换为dict并返回事件数据
"""
尝试:
event_as_dict=json.load(event_str)
除了json.decoder.JSONDecodeError:
返回np.nan
其他的
如果事件“”中不是“eventData”,则为“”dict.keys():
返回np.nan
返回事件作为dict[“eventData”]
df[“eventData”]=df[“event”]。应用(lambda x:从事件(x)获取事件数据)
如果
事件
字典的格式与您预期的不一样,则它将在
事件数据
列中为该行返回N/A

然后,您可以删除那些不符合要求的行,如下所示:

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

我终于从另一篇帖子中找到了答案:

如何使用: json_col=pd.DataFrame([flatte_json(x)表示df['json_column']]中的x)


我终于从另一篇帖子中找到了答案:

如何使用: json_col=pd.DataFrame([flatte_json(x)表示df['json_column']]中的x)


对不起,这是误导。“事件”列实际上是一个字符串列。我能想到的唯一方法是应用正则表达式从该字符串中获取第二个花括号“{}”,并创建一个新列。你知道如何为这个例子构造正则表达式吗?我已经更新了上面的答案,希望事件列是一个字符串。您可以使用
json.loads
将json字符串作为dict/list对象加载。很抱歉造成误导。“事件”列实际上是一个字符串列。我能想到的唯一方法是应用正则表达式从该字符串中获取第二个花括号“{}”,并创建一个新列。你知道如何为这个例子构造正则表达式吗?我已经更新了上面的答案,希望事件列是一个字符串。您可以使用
json.loads
将json字符串作为dict/list对象加载。
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