Имеет смысл использовать account number
в качестве индекса в результирующем DataFrame
и хранить номера строк в столбцах.Простейшим решением будет проверить каждую пару индексов в df1
и df2
и сохранить номера строк в df3
, это будет иметь сложность O (n ^ 2).
Редактировать: Похоже, вы можете повысить производительность, отфильтровав df1
и df2
, используя .isin
, хотя я тестировал его только с фиктивными данными.Это все еще O (n ^ 2), но теперь n - это число совпадающих учетных записей, а не общее количество строк.
import pandas as pd
d1 = {'account': [1234, 5678, 9101, 1121]}
d2 = {'account': [3141, 5161, 7181, 9202, 1222, 1234]}
d3 = {'r1': [], 'r2': []}
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)
df3 = pd.DataFrame(data = d3)
match1 = df1.account.isin(df2.account.values)
match2 = df2.account.isin(df1.account.values)
for r1 in df1[match1].index:
for r2 in df2[match2].index:
if df1.account[r1] == df2.account[r2]:
idx = df1.account[r1]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
Редактировать 2: Я мог бы получить еще лучшую производительностьс этой версией, и это проще:
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
r2 = df2[df2.account == idx].index[0]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
Редактировать 3: Если номера счетов не уникальны в df1
и df2
, использовать их будет невозможно account number
как индекс:
df3 = pd.DataFrame()
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
for r2 in df2[df2.account == idx].index:
row = {'account': idx, 'r1': r1, 'r2': r2}
df3 = df3.append(row, ignore_index=True)