Извлечение частей элементов массива с помощью 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 ответа:
Использование:
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