Заполнение фрейма данных pandas в цикле for

#python #dataframe #for-loop #image-recognition #knime

#python #фрейм данных #for-цикл #распознавание изображений #knime

Вопрос:

Я работаю с Amazon Rekognition, чтобы провести некоторый анализ изображений. С помощью простого скрипта Python я получаю — на каждой итерации — ответ такого типа: (пример для изображения кошки)

 {'Labels':
            [{'Name': 'Pet', 'Confidence': 96.146484375, 'Instances': [],
              'Parents': [{'Name': 'Animal'}]}, {'Name': 'Mammal', 'Confidence': 96.146484375,
                                                 'Instances': [], 'Parents': [{'Name': 'Animal'}]},
             {'Name': 'Cat', 'Confidence': 96.146484375.....
  

Я получил все нужные мне атрибуты в списке, который выглядит следующим образом:

 [Pet, Mammal, Cat, Animal, Manx, Abyssinian, Furniture, Kitten, Couch]
  

Теперь я хотел бы создать фрейм данных, в котором элементы в приведенном выше списке отображаются в виде столбцов, а строки принимают значения 0 или 1.

Я создал словарь, в который я добавляю элементы в список, поэтому я получаю {‘Cat’: 1} , затем я добавляю его в фрейм данных и получаю следующую ошибку: TypeError: Index(…) должен вызываться с какой-то коллекцией, ‘Cat’было передано.

Не только это, но я даже, кажется, не могу добавить в один и тот же фрейм данных информацию из разных изображений. Например, если я вставляю данные только в фрейм данных (в виде строк, а не столбцов), я получаю серию из n строк с n элементами (идентифицированными Amazon Rekognition) только последнего изображения, т. Е. Я начинаю с пустого фрейма данных на каждой итерации. Результат, который я хотел бы получить, выглядит примерно так:

 Image   Human   Animal  Flowers     etc...
Pic1    1        0       0  
Pic2    0        0       1  
Pic3    1        1       0  
  

Для справки, это код, который я использую сейчас (я должен добавить, что я работаю над программным обеспечением под названием KNIME, но это просто Python):

 from pandas import DataFrame
import pandas as pd
import boto3

fileName=flow_variables['Path_Arr[1]']  #This is just to tell Amazon the name of the image
bucket= 'mybucket'
client=boto3.client('rekognition', region_name = 'us-east-2')

response = client.detect_labels(Image={'S3Object':
{'Bucket':bucket,'Name':fileName}})


data = [str(response)]  # This is what I inserted in the first cell of this question

d= {}
for key, value in response.items():
    for el in value:
        if isinstance(el,dict):
            for k, v in el.items():
                if k == "Name":
                    d[v] = 1
                    print(d)
                    df = pd.DataFrame(d, ignore_index=True)

print(df)
output_table = df
  

Я определенно ошибаюсь как в цикле for, так и при добавлении чего-либо в мой фрейм данных, но, похоже, ничего не работает!

Извините за сверхдлинный вопрос, надеюсь, это было ясно! Есть идеи?

Комментарии:

1. можете ли вы показать пример ответа (где ваш второй комментарий), над которым вы работаете?

2. @D-E-N Извините, я не уверен, что понял ваш вопрос, но то, что я получаю из «data = [str (response)] «, это [«{‘Labels’: [{‘Name’: ‘Pet’, ‘Confidence’: 96.146484375, ‘Instances’:[], ‘Parents’: [{‘Name’: ‘Animal’}]}, {‘Name’: ‘Cat’, ‘Confidence’: 96.146484375, ‘Instances’: [{‘BoundingBox’: {‘Width’: 0.6686800122261047, ‘Height’: 0.9005332589149475, ‘Слева’: 0.27255237102508545, ‘Top’: 0.03728689253330231}, ‘Confidence’: 96.146484375}], ‘Parents’: [{‘Name’: ‘Pet’}, …»]

Ответ №1:

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

 import pandas as pd

response = {'Labels': [{'Name': 'Pet', 'Confidence': 96.146484375, 'Instances': [], 'Parents': [{'Name': 'Animal'}]},
                       {'Name': 'Cat', 'Confidence': 96.146484375, 'Instances': [{'BoundingBox':
                                                                                      {'Width': 0.6686800122261047,
                                                                                       'Height': 0.9005332589149475,
                                                                                       'Left': 0.27255237102508545,
                                                                                       'Top': 0.03728689253330231},
                                                                                  'Confidence': 96.146484375}],
                        'Parents': [{'Name': 'Pet'}]
                        }]}


def handle_new_data(repsonse_data: dict, image_name: str) -> pd.DataFrame:
    d = {"Image": image_name}
    result = pd.DataFrame()
    for key, value in repsonse_data.items():
        for el in value:
            if isinstance(el, dict):
                for k, v in el.items():
                    if k == "Name":
                        d[v] = 1
        result = result.append(d, ignore_index=True)

    return result


df_all = pd.DataFrame()
df_all = df_all.append(handle_new_data(response, "image1"))
df_all = df_all.append(handle_new_data(response, "image2"))
df_all = df_all.append(handle_new_data(response, "image3"))
df_all = df_all.append(handle_new_data(response, "image4"))
df_all.reset_index(inplace=True)
print(df_all)