看起来bbox 列的每一行都在list 内包含一个dictionary。我试图复制您的问题如下。 编辑:澄清以下解决方案假定您所指的“JSON 对象”表示为包含单个字典的 list,这就是您的示例所显示的内容和截图。
# Create empty sample DataFrame with one row
df = pd.DataFrame([None],columns=['bbox'])
# Assign your sample item to the first row
df['bbox'][0] = [{"left":191,"top":70,"width":183,"height":311,"label":"glass"}]
现在,简单解压行:
df['bbox_unpacked'] = df['bbox'].map(lambda x: x[0].values())
这将为您提供一个包含 5 个项目的 tuple 的新列。
如果您想更进一步并应用您的标签,您可能需要创建一个字典来包含您的标签逻辑。根据您在 cmets 中给出的示例,我已经完成了:
labels = {
'cardboard': 1,
'trash': 2,
'glass': 3
}
如果您想要一个不编写自己的函数的单行解决方案,这应该会得到您想要的布局。
df['bbox_unpacked'] = df['bbox'].map(lambda x: (list(x[0].values())[:4],labels.get(list(x[0].values())[-1])))
更易读的解决方案是使用.apply() 方法定义您自己的函数。 编辑: 由于您的 JSON 对象看起来像 str 存储在您的 DataFrame 行中,因此我添加了 json.loads(row) 以在检索键之前先处理字符串。您需要import json 才能运行。
import json
def unpack_bbox(row, labels):
# load the string into a JSON object (in this
# case a list of length one containing the dictionary;
# index the list to its first item [0] and use the .values()
# dictionary method to access the values only
keys = list(json.loads(row)[0].values())
bbox_values = keys[:4]
bbox_label = keys[-1]
label_value = labels.get(bbox_label)
return bbox_values, label_value
df['bbox_unpacked'] = df['bbox'].apply(unpack_bbox,args=(labels,))