【问题标题】:How to extract a nested dictionary from a STRING column in Python Pandas Dataframe?如何从 Python Pandas Dataframe 中的 STRING 列中提取嵌套字典?
【发布时间】:2021-03-01 07:31:15
【问题描述】:

有一张表,其列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"}

我该怎么做?

【问题讨论】:

    标签: python regex pandas dataframe re


    【解决方案1】:

    我会考虑在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")
    

    【讨论】:

    • 抱歉误导。 'event' 列实际上是一个 STRING 列。我能想到的唯一方法是应用 REGEX 从该字符串中获取第二个大括号“{ }”并创建一个新列。您知道如何为这种情况构建正则表达式吗?
    • 我已经更新了上面的答案,期望事件列是一个字符串。您可以使用json.loads 将 json 字符串加载为 dict/list 对象。
    【解决方案2】:

    我终于从另一个帖子中找到了答案: Python flatten multilevel/nested JSON

    使用方法: json_col = pd.DataFrame([flatten_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 
    

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2016-07-24
      • 1970-01-01
      • 2019-11-16
      • 2015-10-15
      • 2017-12-26
      • 2023-04-02
      • 2019-07-26
      • 2021-06-02
      相关资源
      最近更新 更多