Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于元组列表选择并连接数据帧行_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 基于元组列表选择并连接数据帧行

Python 基于元组列表选择并连接数据帧行,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个这样的数据帧: 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,

我有两个这样的数据帧:

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] 
})
overlap = [(0,0), (1,0), (2, 1), (3, 1)]
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
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
df_单元格
包含图像上短语的边框坐标,
df_文本
包含图像上的单词及其边框坐标

我创建了一个元组列表,其中短语和单词的边界框基于以下值匹配:
值:

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] 
})
overlap = [(0,0), (1,0), (2, 1), (3, 1)]
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
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
其中元组的第一个元素是
df_text
的索引值,第二个元素是匹配
df_单元格的索引值

我想选择,根据重叠将行合并到一个新的数据框中,如下所示:

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] 
})
overlap = [(0,0), (1,0), (2, 1), (3, 1)]
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
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
然后用相同的
连接单词,如下所示:

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] 
})
overlap = [(0,0), (1,0), (2, 1), (3, 1)]
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
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

如果您能提供帮助,我将不胜感激。

我认为您可以使用列表理解创建的索引将值直接分配给
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

我不明白什么是“匹配”。您可以从数学上说明匹配条件吗?运行代码时(适用于我的实际dfs和列表)会出现以下错误ValueError:必须具有相等的len键和值使用NdarayMeans设置时,任一df中都有更多列。请始终提供与实际数据相似的示例数据。对不起,这是我的错误。我忘了在重新启动后重新运行笔记本中的一个单元格,该单元格删除一列以使列数相等。