Как я могу отфильтровать df «A», используя в качестве условия сравнение с df «B»?

У меня есть два фрейма данных, dfA и dfB, разной формы и с разным порядком. dfA содержится в dfB.

В этом примере есть 3 столбца: «Название должности», «Отдел работы» и «Заработная плата». У dfA отсутствуют значения в столбце «Заработная плата», поэтому я хотел бы получить эти значения от dfB.

Если «Название должности» и «Отдел работы» совпадают между dfA и dfB, «Зарплата за работу» тоже такая же, поэтому я могу использовать «Зарплату за работу» из dbB для заполнения dfA.

Например, каждый «Учитель английского языка» в отделе «Учителя» имеет зарплату X, а «Учитель английского языка» в отделе «Частные преподаватели» имеет другую зарплату, хотя должность та же.

Однако мне пока не удалось найти код для этого.

Мой мыслительный процесс был таким, хотя я думаю, что он совершенно неверен:

condition_A = (dfA['Job Title'] == dfB['Job Title'])

condition_B = (dfA['Job Department'] == dfB['Job Department'])

dfA.loc[(condition_A) & (condition_B), 'Job Salary'] = dfB.loc[(condition_A) & (condition_B), 'Job Salary']

Эта попытка явно не сработала.

dataA = {
    'Job Title': ['ET', 'FT', 'ET', 'ST', 'ST'],
    'Job Department': ['T', 'T', 'PT', 'T', 'PT'],
    'Job Salary': [np.nan, 1500, 1000, np.nan, np.nan]
}
dfA = pd.DataFrame(dataA)

dataB = {
    'Job Title': ['ST', 'ET', 'RT', 'FT', 'ST', 'PT', 'ET'],
    'Job Department': ['T', 'T', 'PT', 'T', 'PT', 'T', 'PT'],
    'Job Salary': [2000, 800, 1700, 1500, 2500, 700, 1000]
}
dfB = pd.DataFrame(dataB)

Желаемый результат (пропущенные значения dfA заполнены из dfB):

dataA = {
    'Job Title': ['ET', 'FT', 'ET', 'ST', 'ST'],
    'Job Department': ['T', 'T', 'PT', 'T', 'PT'],
    'Job Salary': [800, 1500, 1000, 2000, 2500]
}
dfA = pd.DataFrame(dataA)

Заранее спасибо!

покажи нам, а не рассказывай нам. Можете ли вы предоставить воспроизводимый пример: stackoverflow.com/help/minimal-reproducible-example

iBeMeltin 25.07.2024 20:39

Попробую сделать это сейчас, дай мне минутку. Я отредактирую пост.

Alex 25.07.2024 20:41

Все еще не воспроизводимо... Используйте dict и предоставьте больше данных. Копирование, которое испортит данные md, займет вечность.

Hans 25.07.2024 21:08

Наконец мне удалось продемонстрировать это с помощью словаря. Пожалуйста, дайте мне знать, если необходимы дополнительные данные или информация.

Alex 25.07.2024 21:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
dfA = pd.merge(
    dfA,
    dfB,
    how = "left",
    on=["Job Title", "Job Department"],
    suffixes=("_dropme", ""),
).drop(columns='Job Salary_dropme')

Результаты в таблице, как вы описываете, за исключением последнего значения зарплаты на работе, которое я предполагаю, если с вашей стороны допущена ошибка, поскольку в приведенных примерах для dfA и dfB не существует названия-отдела-зарплаты.

Должность Отдел трудоустройства Заработная плата восточноевропейское время Т 800 ФТ Т 1500 восточноевропейское время ПТ 1000 СТ Т 2000 г. СТ ПТ 2500

Я думаю, это может сработать. Не могли бы вы объяснить, что делают how и suffixes?

Alex 25.07.2024 21:42

Без проблем. Опция pd.merge с опцией how='left' по сути выполняет левое соединение sql (где находится левая таблица dfA). Это сохраняет dfA затемнение. При выполнении SQL-подобных соединений необходим уникальный ключ. В данном случае это кортеж Должность-Отдел работы. Остальные столбцы добавляются как часть объединения. В основном эти две таблицы имеют общий столбец «Зарплата за работу» — как мы можем представить их в одной таблице, если у них одинаковое имя? Чтобы решить эту проблему, в столбец suffixes=("_dropme", "") добавляются суффиксы к «Зарплата за работу», чтобы имена столбцов были уникальными. Надеюсь, это поможет!

dydev 25.07.2024 21:48

Тысму за помощь и разъяснения. Ваше решение сработало. Я не могу проголосовать против, потому что у меня недостаточно репутации, но я проверил ваше предложение как решение.

Alex 25.07.2024 22:17

Вы можете заранее удалить столбец из dfA: dfA.drop('Job Salary', axis=1).merge(dfB, on=['Job Title', 'Job Department'], how='left'). Или: dfA[['Job Title', 'Job Department']].merge(dfB, on=['Job Title', 'Job Department'], how='left'). Вам не нужно будет устанавливать suffixes таким образом.

ouroboros1 25.07.2024 22:19

@ouroboros1 Отличный трюк! Однако с помощью этого решения мы бы предположили, что какие бы dfA ни были зарплаты, они есть и у dfB - что, я полагаю, работает в этом конкретном (небольшом) примере. Крайний случай, о котором я здесь напрасно думаю, — это когда зарплата в dfA отличается от dfB, но ни одна из них не равна нулю — какой из них мы бы приняли за истину.

dydev 25.07.2024 22:27

ОП прямо говорит, что dfA и dfB будут иметь одинаковую зарплату для значений, отличных от NaN. В противном случае, конечно, можно было бы использовать оба столбца рядом.

ouroboros1 25.07.2024 22:35

@ouroboros1 ну, я с уважением не согласен - ОП мог бы неявно сказать, что зарплаты dfA и dfB одинаковы, когда он упомянул, что dfA содержится в dfB. Содержащийся в этом контексте может означать несколько вещей, одна из которых содержится в столбцах, но не в значениях.

dydev 25.07.2024 22:43

ОП пишет: Если «Название должности» и «Отдел трудоустройства» совпадают между dfA и dfB, «Зарплата за работу» тоже такая же, поэтому я могу использовать «Зарплату за работу» из dbB для заполнения dfA. Я не вижу ничего двусмысленного в этом утверждении.

ouroboros1 25.07.2024 22:45

Двусмысленность для меня возникает в контексте, ведущем к этому предложению, когда ОП упоминает, что у dfA отсутствуют значения в столбце «Зарплата за работу», поэтому я хотел бы получить эти значения от dfB, что означает, что следующее совпадение, о котором говорит ОП , то есть ваша цитата, относится только к случаям, когда в dfA отсутствуют зарплаты, что приводит к двусмысленности в случаях, когда есть совпадение по ключу, но у dfs разные зарплаты.

dydev 25.07.2024 23:04

Для комбинации «Название должности» и «Отдел должностей» может быть только одна «Зарплата за работу», и оба dfA и dfB имели бы одинаковые значения, если бы в A не было значений NaN. Когда я сказал, что dfA содержится в dfB, я имел в виду, что могу найти каждую запись A в B, но в моем случае реальные фреймы данных не так просты, столбцов намного больше, и для завершения мне действительно нужна была только информация «Зарплата за работу» из B. А.

Alex 26.07.2024 03:02

Другие вопросы по теме