Левый фрейм данных MASTER =
Правый фрейм данных ORDERS =
Ожидаемый результат Dataframe =
Таблицы MASTER и ORDERS объединяются LEFT-OUTER с помощью KEY = [Fname, Lname]
Обе таблицы имеют одинаковые столбцы, но строки расположены в разном порядке. Я хочу, чтобы операция соединения игнорировала регистр и игнорировала такие символы, как тире, пробелы и апострофы (например, таблицы будут объединены по значениям «johnsmithrichards» и «davidobrien»)
(На практике в реальных таблицах гораздо больше столбцов, и результирующая выходная таблица должна извлечь некоторые значения из таблицы MASTER, а другие — из таблицы ORDERS, поэтому я использовал mdfcols
и odfcols
соответственно, чтобы включить только эти конкретные столбцы.)
Моя попытка удалить только пробелы не работает:
key = ["Fname", "Lname"]
mdfkey = (mdf["First Name"].str.lower() + mdf["Last Name"].str.lower()).replace(' ', '')
mdfcols = ["Fname", "Lname"]
odfkey = (odf["First Name"].str.lower() + odf["Last Name"].str.lower()).replace(' ', '')
odfCols = ["Amount"]
outputdf = pd.merge(
mdf.loc[:, mdfcols],
odf.loc[:, odfCols],
how='left', left_on=mdfkey, right_on=odfkey)
Используйте Series.str.replace для удаления небуквенно-цифровых значений для обоих DataFrames, последний вспомогательный столбец удаления key_0
:
key = ["Fname", "Lname"]
mdfkey = (mdf["Fname"] + mdf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True).str.lower()
mdfcols = ["Fname", "Lname"]
odfkey = (odf["Fname"] + odf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True).str.lower()
odfCols = ["Amount"]
outputdf = pd.merge(
mdf.loc[:, mdfcols],
odf.loc[:, odfCols],
how='left', left_on=mdfkey, right_on=odfkey).drop('key_0', axis=1)
print (outputdf)
Fname Lname Amount
0 John Smith-Richards 11
1 David O'Brien 36
Решение с вспомогательными столбцами:
merging = ['merge']
key = ["Fname", "Lname"]
mdf['merge'] = ((mdf["Fname"] + mdf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True)
.str.lower())
mdfcols = ["Fname", "Lname"]
odf['merge'] = ((odf["Fname"] + odf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True)
.str.lower())
odfCols = ["Amount"]
outputdf = pd.merge(
mdf.loc[:, mdfcols + merging],
odf.loc[:, odfCols + merging],
how='left', on=merging).drop(merging, axis=1)
print (outputdf)
Fname Lname Amount
0 John Smith-Richards 11
1 David O'Brien 36
Создайте новый ключевой столбец в обоих DataFrames, объединив
Fname
иLname
, преобразуйте их в нижний регистр и удалитеunwanted characters
. Затем вы можете использовать этот ключевой столбец для выполнения слияния.