Извлечение частей элементов массива с помощью python


Я работаю над извлечением всех целочисленных значений из определенного столбца (левый, верхний, длина и ширина) в файле csv с несколькими строками и столбцами. Я использовал панд, чтобы изолировать столбцы, которые меня интересуют, но я застрял на том, как использовать определенные части массива.

Позвольте мне объяснить: мне нужно использовать столбец CSV-файла с атрибутами "left, top, length и width", чтобы затем получить xmin, ymin, xmax и ymax (это скоординированные поля в изображениях). Пример строки в этом столбце выглядит так:

[{"left":171,"top":0,"width":163,"height":137,"label":"styrofoam container"},{"left":222,"top":42,"width":45,"height":70,"label":"chopstick"}]

И мне нужно извлечь 171, 0, 163 и 137, чтобы выполнить необходимые операции для нахождения моих xmax, xmin, ymax и ymin

Приведенная выше строка является одной строкой в моем массиве pandas, как мне извлечь числа, необходимые для выполнения моих операций?

Вот код, который я написал, чтобы извлечь столбец, и это то, что у меня есть до сих пор:

import os
import csv
import pandas
import numpy as np

csvPath = "/path/of/my/csvfile/csvfile.csv"

data = pandas.read_csv(csvPath)
csv_coords = data['Answer.annotation_data'].values #column with the coordinates
image_name = data ['Input.image_url'].values
print csv_coords[2]
2 2

2 ответа:

Использование:

import ast

d = {'Answer.annotation_data': ['[{"left":171,"top":0,"width":163,"height":137,"label":"styrofoam container"},{"left":222,"top":42,"width":45,"height":70,"label":"chopstick"}]',
                                '[{"left":170,"top":10,"width":173,"height":157,"label":"styrofoam container"},{"left":222,"top":42,"width":45,"height":70,"label":"chopstick"}]']}
df = pd.DataFrame(d)

print (df)
                              Answer.annotation_data
0  [{"left":171,"top":0,"width":163,"height":137,...
1  [{"left":170,"top":10,"width":173,"height":157...

#convert string data to list of dicts if necessary
df['Answer.annotation_data'] = df['Answer.annotation_data'].apply(ast.literal_eval)

Для каждого значения cols извлеките значения dict и возвратите DataFrame, последние соедините вместе с помощью concat:

def get_val(val):
    comb = [[y.get(val, np.nan) for y in x] for x in df['Answer.annotation_data']]
    return pd.DataFrame(comb).add_prefix('{}_'.format(val))

cols = ['left','top','width','height']
df1 = pd.concat([get_val(x) for x in cols], axis=1)
print (df1)
   left_0  left_1  top_0  top_1  width_0  width_1  height_0  height_1
0     171     222      0     42      163       45       137        70
1     170     222     10     42      173       45       157        70

Для доступа к одному полю в вашем DataFrame

`data.loc[row][column]` or `data.loc[row,column]`

Например

`data.loc[0]['left']

Найти, например, минимум значений top глобально

min(data['top'])