Как получить имена столбцов, которые принадлежат только правой таблице, которую мы привели в левом соединении - PullRequest
0 голосов
/ 13 ноября 2018

Я делаю следующее левое соединение

left_join = left.merge(right, how="left", left_on=[attr1], right_on=[attr2])

Как теперь я могу получить имена столбцов, которые принадлежат только правой таблице в левом соединении?Pandas иногда переименовывает столбцы, если мы приводим столбец с одинаковым именем, поэтому я не могу просто получить имена столбцов из правой таблицы.Также, поскольку мы объединяем один атрибут, один из столбцов не будет присутствовать, поэтому мне нужно каким-то образом извлечь их из left_join.

Спасибо!

РЕДАКТИРОВАТЬ: Мое решение оказалось проще, чем я ожидал.Я решил это как

names = left_join.columns.values

names[left.shape[1]:]

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы можете сделать с фильтром до merge, затем rename

left_join = left[attr1].\
             merge(right, how="left", left_on=[attr1], right_on=[attr2]).\
              rename(columns=dict(zip(attr1,attr2)))
0 голосов
/ 13 ноября 2018

Используйте аргумент suffixes

Если есть перекрывающиеся столбцы, вы можете контролировать то, что добавляется к имени столбца, с помощью аргумента suffixes.

left.merge(right, 'left', left_on=attr1, right_on=attr2, suffixes=['_', ''])

   A  B_     B    C    D    E    F
0  1   4  10.0    X    I  7.0  1.0
1  2   5  11.0    Y    J  8.0  2.0
2  3   6   NaN  NaN  NaN  NaN  NaN

Обратите внимание, что имя перекрывающегося столбца 'B' имеет суффикс '_', добавленный к столбцу, взятому из кадра данных left, и суффикс '' (да, пустая строка), добавленный к столбцу имя из right кадра данных.

Теперь имена столбцов из right совпадают с именами столбцов из right

left.merge(right, 'left', left_on=attr1, right_on=attr2, suffixes=['_', ''])[[*right]]

      B    C    D    E    F
0  10.0    X    I  7.0  1.0
1  11.0    Y    J  8.0  2.0
2   NaN  NaN  NaN  NaN  NaN

Детали [[*right]]

right.columns.tolist()

['C', 'D', 'E', 'F']

Или, как я положил в ответ

[*right]

['C', 'D', 'E', 'F']

Настройка

left = pd.DataFrame(dict(
    A=[1, 2, 3],
    B=[4, 5, 6],
))

right = pd.DataFrame(dict(
    B=[10, 11, 12],
    C=[*'XYZ'],
    D=[*'IJK'],
    E=[7, 8, 9],
    F=[1, 2, 4]
))

attr1 = 'A'
attr2 = 'F'
0 голосов
/ 13 ноября 2018
# Get column names from `right` that were a part of the merge key.
m1 = left_join.columns.isin(right.columns)
# Get column names that were appended with suffix "_y".
m2 = left_join.columns.str.endswith('_y')

left_join.iloc[:, m1 | m2]

Если вам нужны только столбцы, исключающие right, замените последнюю строку кода выше на

left_join.iloc[:, m2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...