Python如何通过特定列和额外行循环序列匹配数据帧

2024-10-02 22:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在过去的两周里,我一直在努力解决这个问题,我几乎达到了目标

案例:Overall depiction of what i am trying

  • 我从两个不同的excel表中提取了两个数据帧,对于这个示例,让我们假设3x3(DF1和DF2)
  • 我想将DF1中第2列的单元格与DF2中第2列的单元格进行匹配
  • 我需要一个一个地匹配单元格

示例:假设我有单元格X1,我匹配它,Y(1,2,3)中的每个单元格 X1与Y3最匹配

  • 我想提取X1所在的行和Y3所在的行,并将它们相邻对齐地保存在一行中,可能保存在3中。excel表格

更新了我的信息:

此代码能够与sequencematcher匹配并打印匹配,但是我只获得一个输出匹配,而不是最大匹配的列表:

import pandas as pd
from difflib import SequenceMatcher

data1 = {'Fruit': ['Apple','Pear','mango','Pinapple'],
        'nr1': [22000,25000,27000,35000],
        'nr2': [1,2,3,4]}

data2 = {'Fruit': ['Apple','Pear','mango','Pinapple'],
        'nr1': [22000,25000,27000,35000],
        'nr2': [1,2,3,4]}

df1 = pd.DataFrame(data1, columns = ['Fruit', 'nr1', 'nr2'])
df2 = pd.DataFrame(data2, columns = ['nr1','Fruit', 'nr2'])

#Single out specefic columns to match
col1=(df1.iloc[:,[0]])
col2=(df2.iloc[:,[1]])

#function to match 2 values similarity
def similar(a,b):
    ratio = SequenceMatcher(None, a, b).ratio()
    matches = a, b
    return ratio, matches

for i in col1:
    print(max(similar(i,j) for j in col2))

产量:(1.0,(‘水果’、‘水果’))

我如何修复,以便它将为我提供所有最大匹配,以及我如何提取匹配所在的相应行


Tags: columnsimport示例excelpddf1df2x1
1条回答
网友
1楼 · 发布于 2024-10-02 22:32:09

这应该起作用:

import pandas as pd
import numpy as np
from difflib import SequenceMatcher


def similar(a, b):
    ratio = SequenceMatcher(None, a, b).ratio()
    return ratio


data1 = {'Fruit': ['Apple', 'Pear', 'mango', 'Pinapple'],
         'nr1': [22000, 25000, 27000, 35000],
         'nr2': [1, 2, 3, 4]}

data2 = {'Fruit': ['Apple', 'mango', 'peer', 'Pinapple'],
         'nr1': [22000, 25000, 27000, 35000],
         'nr2': [1, 2, 3, 4]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

order = []
for index, row in df1.iterrows():
    maxima = [similar(row['Fruit'], j) for j in df2['Fruit']]
    best_ratio = max(maxima)
    best_row = np.argmax(maxima)

    order.append(best_row)

df2 = df2.iloc[order].reset_index()

pd.concat([df1, df2], axis=1)

相关问题 更多 >