首页 > 解决方案 > 将熊猫数据框中的“defaultdict”字符串对象转换为字典

问题描述

我在熊猫数据框列中有一个字典的字符串表示形式。我需要提取字典。

这是我最小的可重现示例:

import pandas as pd
from collections import defaultdict

df = pd.DataFrame({
                'id': ['7e9zsX7CM4','ftisjah421'], 
                'img_dict': ["defaultdict(< class 'list'>, {'7e9zsX7CM4': ['https://image_1.png','https://image_2.png']})", "  "] 
             })

img_dict = df['img_dict'][0]

print(type(img_dict))

<class 'str'>

NaNs请注意,列中有一些df['img_dict']并应用ast.literal_eval退货

ValueError: malformed node or string: nan

这就是数据在 pandas 数据框中的呈现方式。所以,我试图找到将这个字符串转换为 python 字典的 hacky 方法?在理想的世界中,这个对象应该被存储为dict而不是string,但是,我不拥有这些数据。

标签: pythonpandasdictionary

解决方案


下面的代码是一个黑客。它不能是一个令人满意的解决方案,但它应该适用于您的情况。如果您的列img_dict是 JSON 对象会更好。

您必须提取defaultdict表示 ( repr) 的第二个参数并使用literal_evalfrom astmodule 来(尝试)重新创建 dict(而不是 defaultdict)。

default_dict(default_factory, dict)
import ast

df['dict'] = \
    df.loc[df['img_dict'].str.startswith('defaultdict', na=False), 'img_dict'] \
      .str.extract('({.*})', expand=False) \
      .apply(ast.literal_eval)
>>> df
           id                                           img_dict                                               dict
0  7e9zsX7CM4  defaultdict(< class 'list'>, {'7e9zsX7CM4': ['...  {'7e9zsX7CM4': ['https://image_1.png', 'https:...
1  ftisjah421                                                                                                   NaN

>>> df.iloc[0, 2]
{'7e9zsX7CM4': ['https://image_1.png', 'https://image_2.png']}

>>> type(df.iloc[0, 2])
dict

推荐阅读