Saya telah mencoba 2 minggu terakhir untuk menyelesaikan masalah ini, dan saya hampir mencapai tujuannya.

Kasus: Penggambaran keseluruhan tentang apa yang saya coba

  • Saya memiliki 2 kerangka data yang diekstraksi dari 2 lembar excel yang berbeda untuk contoh ini, katakanlah 3x3 (DF1 dan DF2)
  • Saya ingin mencocokkan sel dari Column2 di DF1 dengan Column2 di DF2
  • Saya harus mencocokkan sel satu per satu

Contoh: Katakanlah saya memiliki Sel X1 dan saya mencocokkannya dengan setiap sel di Y(1,2,3) X1 yang paling cocok dengan Y3.

  • Saya ingin Mengekstrak Baris X1 berada dan Baris Y3 berada dan menyimpannya sejajar satu sama lain dalam satu baris berpotensi dalam 3. lembar excel

DIPERBARUI Apa yang saya miliki:

Kode ini dapat dicocokkan dengan sequencematcher dan mencetak kecocokan, namun saya hanya mendapatkan satu kecocokan keluaran alih-alih daftar kecocokan maksimum:

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))

Keluaran: (1.0, ('Buah', 'Buah'))

Bagaimana cara memperbaikinya sehingga akan memberi saya semua kecocokan maksimal dan bagaimana cara mengekstrak masing-masing baris tempat kecocokan berada?

0
Shawn Atlas 3 Juni 2020, 12:01

1 menjawab

Jawaban Terbaik

Ini harus bekerja:

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)
0
Not_a_programmer 3 Juni 2020, 11:18