Выбор и объединение строк фрейма данных на основе списка кортежей

#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. Извините, это была моя ошибка. Я забыл перезапустить ячейку в моей записной книжке после перезагрузки, которая удаляет столбец, чтобы сделать количество столбцов равным.