Python 如何通过特定的列和额外的行循环序列匹配数据帧
Python How to loop sequence match Dataframes through specific columns and extra the rows
过去 2 周我一直在尝试解决这个问题,我快要达到目标了。
案例:
Overall depiction of what i am trying
- 我从 2 个不同的 excel sheet 中提取了 2 个数据帧,对于这个例子,我们假设 3x3(DF1 和 DF2)
- 我想匹配 DF1 中 Column2 的单元格与 DF2 中的 Column2
- 我需要一个一个匹配单元格
示例:假设我有单元格 X1 并且我将它与 Y(1,2,3) 中的每个单元格相匹配
X1与Y3匹配度最高
- 我想提取 X1 行和 Y3 行,并将它们并排保存在一行中,可能在 3 中。excel sheet
已更新我有什么:
此代码能够与 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, ('Fruit', 'Fruit'))
我该如何修复才能为我提供所有最大匹配项以及如何提取匹配项所在的相应行?
这应该有效:
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)
过去 2 周我一直在尝试解决这个问题,我快要达到目标了。
案例: Overall depiction of what i am trying
- 我从 2 个不同的 excel sheet 中提取了 2 个数据帧,对于这个例子,我们假设 3x3(DF1 和 DF2)
- 我想匹配 DF1 中 Column2 的单元格与 DF2 中的 Column2
- 我需要一个一个匹配单元格
示例:假设我有单元格 X1 并且我将它与 Y(1,2,3) 中的每个单元格相匹配 X1与Y3匹配度最高
- 我想提取 X1 行和 Y3 行,并将它们并排保存在一行中,可能在 3 中。excel sheet
已更新我有什么:
此代码能够与 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, ('Fruit', 'Fruit'))
我该如何修复才能为我提供所有最大匹配项以及如何提取匹配项所在的相应行?
这应该有效:
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)