如何从列中获取属性height、width、x和y?

2024-09-29 19:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我们在一个CSV文件中存储了1000行相同的信息,如下所示。如何在python中循环并获取属性x、y、height和width

[{"task":"T0","task_label":"Draw a box around each person name and transcribe their information.","value":[{"x":224.63333129882812,"y":89.96666717529297,"tool":0,"frame":0,"width":333.9999694824219,"height":42.00000762939453,"details":[{"value":"Rev. Leopold Wyke Acland"},{"value":0}],"tool_label":"Tool name"},{"x":95.63333129882812,"y":55.96666717529297,"tool":0,"frame":0,"width":280,"height":37,"details":[{"value":"Acland, Thomas Wyke"},{"value":0}],"tool_label":"Tool name"}]}]

Tags: 文件csvname信息taskvaluetooldetails
3条回答

如果所有行的格式都相同,则可以遍历这些行并捕获列表中的值,如下所示:

x, y, height, width = list(), list(), list(), list()

for row in rows:
    x.append(row[0]["value"][0]["x"])
    y.append(row[0]["value"][0]["y"])
    height.append(row[0]["value"][0]["height"])
    width.append(row[0]["value"][0]["width"])

您可以将捕获的值存储为dict,然后很容易将其转换为数据帧:

d = {"x": x, "y": y, "height": height, "width": width}
df = pd.DataFrame(data=d)

如果外部列表实际上只包含1个元素,那么所有内容都在l[0]['value']

In [14]: pd.DataFrame(l[0]['value']).iloc[:, :6]
Out[14]:
            x          y  tool  frame       width     height
0  224.633331  89.966667     0      0  333.999969  42.000008
1   95.633331  55.966667     0      0  280.000000  37.000000

如果实际上有多个条目,您可以一次转换一个条目并使用pd.concat

In [16]: pd.concat([pd.DataFrame(v['value']).iloc[:, :6] for v in l*3]).reset_index(drop=True)
Out[16]:
            x          y  tool  frame       width     height
0  224.633331  89.966667     0      0  333.999969  42.000008
1   95.633331  55.966667     0      0  280.000000  37.000000
2  224.633331  89.966667     0      0  333.999969  42.000008
3   95.633331  55.966667     0      0  280.000000  37.000000
4  224.633331  89.966667     0      0  333.999969  42.000008
5   95.633331  55.966667     0      0  280.000000  37.000000

因为最外层的list只包含一个具有3个字段的对象

  1. task不是必需的
  2. task_label不是必需的
  3. value我们感兴趣的一个

在给定的上下文中,我们可以按以下方式在dict上循环

for item in data[0]["value"]:
    print(f"x = {item['x']}")
    print(f"y = {item['y']}")
    print(f"width = {item['width']}")
    print(f"height = {item['height']}")

您还可以以一种更具python风格的方式收集这些值,然后遍历生成的字典列表

result = [
            {
                "x": item["x"], 
                "y": item["y"], 
                "width": item["width"], 
                "height": item["height"]
             } 
          for item in data[0]["value"]]

我建议用python进行迭代。此外,此代码段假定所有行的结构都是一致的

https://wiki.python.org/moin/ForLoop

相关问题 更多 >

    热门问题