python - 将熊猫数据框中的“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
,但是,我不拥有这些数据。
解决方案
下面的代码是一个黑客。它不能是一个令人满意的解决方案,但它应该适用于您的情况。如果您的列img_dict
是 JSON 对象会更好。
您必须提取defaultdict
表示 ( repr
) 的第二个参数并使用literal_eval
from ast
module 来(尝试)重新创建 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
推荐阅读
- java - 传递一个列表,其元素是andriod JAVA中的对象
- r - 使用 writeRaster 的 for 循环问题
- java - 通过 LocalDateFilter 弹簧休息控制器时收到错误请求
- tkinter - 如何在 tkinter 中更改子菜单栏的高度?
- python - 为什么相同操作的精度不同?
- flutter - 使用 Dart 从 Flutter 中的 API 获取数据时出现问题
- python - 如何在 Tkinter 中获取单选按钮的值?
- sql - 使用 GROUP BY 将表与关于类别的列绑定在一起
- reactjs - 怎么设置material-ui持卡人头像?
- android - 屏幕关闭时使用服务中的位置更新 MapView