代码之家  ›  专栏  ›  技术社区  ›  MathMan 99

Python:将包含字符串的列转换为包含json字典的列

  •  0
  • MathMan 99  · 技术社区  · 4 年前

    我有一个数据框架,其中的列如下所示:

    df=pd.DataFrame()
    df['symbol'] = ['A','B','C']
    df['json_list'] = ['[{name:S&P500, perc:25, ticker:SPY, weight:1}]',
              '[{name:S&P500, perc:25, ticker:SPY, weight:0.5}, {name:NASDAQ, perc:26, ticker:NASDAQ, weight:0.5}]',
              '[{name:S&P500, perc:25, ticker:SPY, weight:1}]']
    df['date'] = ['2022-01-01', '2022-01-02', '2022-01-02']
    df:
        symbol  json_list                                         date
    0   A       [{name:S&P500, perc:25, ticker:SPY, weight:1}]    2022-01-01
    1   B       [{name:S&P500, perc:25, ticker:SPY, weight:0.5... 2022-01-02
    2   C       [{name:S&P500, perc:25, ticker:SPY, weight:1}]    2022-01-02
    

    中的值 json_list 列为的 <class 'str'> .

    如何转换 json_list 列项目到dict,以便我可以基于键:值对访问它们?

    提前谢谢。

    1 回复  |  直到 4 年前
        1
  •  1
  •   constantstranger    4 年前

    已更新 以反映这样一个事实,即问题中的json字符串不是单例列表,而是可以包含多个类似dict的元素。

    这将使 list 属于 dict 对象位于数据帧的新列中:

    def foo(x):
        src = x['json_list']
        rawList = src[1:-1].split('{')[1:]
        rawDictList = [x.split('}')[0] for x in rawList]
        dictList = [dict(x.strip().split(':') for x in y.split(',')) for y in rawDictList]
        for dct in dictList:
            for k in dct:
                try:
                    dct[k] = int(dct[k])
                except ValueError:
                    try:
                        dct[k] = float(dct[k])
                    except ValueError:
                        pass
        return dictList
    df['list_of_dict_object'] = df.apply(foo, axis = 1)
    

    原答覆:

    这将使 字典 在数据帧的一个新列中,除了数字类型之外,它应该能提供接近您想要的内容:

    df['dict_object'] = df.apply(lambda x: dict(x.strip().split(':') for x in x['json_list'][2:-2].split(',')), axis = 1)
    
    

    要获取字符串值可转换的float或int,可以执行以下操作:

    def foo(x):
        d = dict(x.strip().split(':') for x in x['json_list'][2:-2].split(','))
        for k in d:
            try:
                d[k] = int(d[k])
            except ValueError:
                try:
                    d[k] = float(d[k])
                except ValueError:
                    pass
        return d
    df['dict_object'] = df.apply(foo, axis = 1)
    
        2
  •  0
  •   Håken Lid    4 年前

    “json”几乎是有效的yaml。如果在冒号后面添加一个空格,则可以使用pyyaml对其进行解析。

    df.json_list.apply(lambda data: yaml.safe_load(data.replace(':', ': ')))