Объединять строки данных в словарь - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть объект DataFrame от pandas, где каждая строка представляет один объект на изображении.

Один пример возможной строки:

{'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'5', 'obj_type':'car'}

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

{'img_filename': 'img1.txt', 'img_size':'20', 'obj': [{'obj_size':'5', 'obj_type':'car'}, {{'obj_size':'6', 'obj_type':'bus'}}]}

То есть третий столбец - это список столбцов, содержащих данные каждой группы.

Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Рассмотрим следующий пример.

import pandas as pd
df1 = pd.DataFrame([
{'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'5', 'obj_type':'car'}, 
{'img_filename': 'img1.txt', 'img_size':'20', 'obj_size':'6', 'obj_type':'bus'}, 
{'img_filename': 'img2.txt', 'img_size':'25', 'obj_size':'4', 'obj_type':'car'}
])

df2 = pd.DataFrame([
{'img_filename': 'img1.txt', 'img_size':'20', 'obj': [{'obj_size':'5', 'obj_type':'car'}, {'obj_size':'6', 'obj_type':'bus'}]},
{'img_filename': 'img2.txt', 'img_size':'25', 'obj': [{'obj_size':'4', 'obj_type':'car'}]}
])

Я хочу превратить df1 в df2.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Один вкладыш.

Предположим, у вас одинаковые img_filename и разные img_size, и вы хотите join значение.Например:

  img_filename img_size obj_size obj_type
0     img1.txt       20        5      car
1     img1.txt       22        6      bus
2     img2.txt       25        4      car

# if you want to join the img_size of img1.txt like 20, 22
df2 = df1.groupby("img_filename")["img_size", "obj_size", "obj_type"].apply(lambda x: pd.Series({"obj": x[["obj_size", "obj_type"]].to_json(orient="records"), "img_size": ','.join(x["img_size"])})).reset_index()

Вывод:

  img_filename                                                obj img_size
0     img1.txt  [{"obj_size":"5","obj_type":"car"},{"obj_size"...    20,22
1     img2.txt                [{"obj_size":"4","obj_type":"car"}]       25

С учетом первого значения

#if you want to consider only first value i.e. 20
df2 = df1.groupby("img_filename")["img_size", "obj_size", "obj_type"].apply(lambda x: pd.Series({"obj": x[["obj_size", "obj_type"]].to_json(orient="records"), "img_size": x["img_size"].iloc[0]})).reset_index()

Вывод:

  img_filename                                                obj img_size
0     img1.txt  [{"obj_size":"5","obj_type":"car"},{"obj_size"...       20
1     img2.txt                [{"obj_size":"4","obj_type":"car"}]       25
0 голосов
/ 22 ноября 2018

В одну сторону, используя to_dict

df2 = df1.groupby('img_filename')['obj_size','obj_type'].apply(lambda x: x.to_dict('records'))
df2 = df2.reset_index(name='obj')

# Assuming you have multiple same img files with different sizes then I'm choosing first.
# If this not the case then groupby directly and reset index.
#df1.groupby('img_filename, 'img_size')['obj_size','obj_type'].apply(lambda x: x.to_dict('records'))

df2['img_size'] = df1.groupby('img_filename')['img_size'].first().values

print (df2)

  img_filename                                                obj img_size
0     img1.txt  [{'obj_size': '5', 'obj_type': 'car'}, {'obj_s...       20
1     img2.txt             [{'obj_size': '4', 'obj_type': 'car'}]       25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...