#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
У меня есть два фрейма данных, подобных этому:
df_cells = pd.DataFrame({
'left': [1095, 257],
'top': [1247, 1148],
'right': [1158, 616],
'bottom': [1273, 1176]
})
df_text = pd.DataFrame({
'words': ['Hello', 'world', 'nice day', 'have a'],
'left': [1097, 1099, 258, 259],
'top': [1248, 1249, 1156, 1153],
'right': [1154, 1156, 615, 614],
'bottom': [1269, 1271, 1175, 1172]
})
df_cells
содержит координаты ограничивающих рамок для фраз на изображении и df_text
содержит слова и их координаты ограничивающих рамок на изображении.
Я создал список кортежей, в которых ограничительные рамки для фраз и слов совпадают на основе left
, top
, right
, bottom
значений, подобных этому:
overlap = [(0,0), (1,0), (2, 1), (3, 1)]
где первый элемент кортежа является значением индекса df_text
, а второй элемент соответствует значению индекса df_cells
.
Я хочу выбрать, объединить строки на основе перекрытия в новый фрейм данных следующим образом:
Words df_cells.left df_cells.top df_cells.right df_cells.bottom
Hello 1095 1247 1158 1273
world 1095 1247 1158 1273
Have a 257 1148 616 1176
nice day 257 1148 616 1176
а затем объедините слова с одинаковыми left
, top
, right
, bottom
вот так:
Words df_cells.left df_cells.top df_cells.right df_cells.bottom
Hello world 1095 1247 1158 1273
Have a nice day 257 1148 616 1176
Был бы признателен за помощь в этом.
Комментарии:
1. Я не понимаю, что определяет «совпадение». Можете ли вы математически сформулировать условие соответствия?
Ответ №1:
Я думаю, вы можете присвоить значения непосредственно df_text
индексу, созданному с помощью понимания списка:
df_text.iloc[[i[0] for i in overlap], 1:] = df_cells.iloc[[i[1] for i in overlap]].to_numpy()
print (df_text)
words left top right bottom
0 Hello 1095 1247 1158 1273
1 world 1095 1247 1158 1273
2 nice day 257 1148 616 1176
3 have a 257 1148 616 1176
print (df_text.groupby(["left", "top", "right", "bottom"], as_index=False).agg({"words":" ".join}))
left top right bottom words
0 257 1148 616 1176 nice day have a
1 1095 1247 1158 1273 Hello world
Комментарии:
1. При запуске вашего кода выдается следующая ошибка (адаптированная для моих реальных dfs и list) ValueError: должны быть одинаковые ключи len и значение при настройке с помощью ndarray
2. Означает, что у вас больше столбцов в любом из ваших df. Пожалуйста, всегда предоставляйте образцы данных, которые напоминают ваши фактические данные.
3. Извините, это была моя ошибка. Я забыл перезапустить ячейку в моей записной книжке после перезагрузки, которая удаляет столбец, чтобы сделать количество столбцов равным.