Как отфильтровать DataFrame на основе другого DataFrame

Вопрос или проблема

Мой датафрейм загружается из csv файла, который выглядит так

RepID   Account    Rank
123     Abcd       1
345     Zyxw       2
567     Hijk       3
...
...
837    Kjsj        8

и у меня есть другой csv, который имеет только один столбец

RepID
345
488

Я загружаю первый csv в датафрейм df, а другой csv в датафрейм dE

Я хочу иметь новый датафрейм dX, который будет содержать все записи из df, у которых RepID не существует в dE, и dY все записи, у которых RepID существует в dE

как это сделать?

Возможное решение, которое использует булевую индексацию и isin:

df[df['RepID'].isin(dE['RepID'])] # dY

df[~df['RepID'].isin(dE['RepID'])] # dX

Вывод:

# dY
   RepID Account  Rank
1    345    Zyxw     2

# dX
   RepID Account  Rank
0    123    Abcd     1
2    567    Hijk     3
3    837    Kjsj     8

Ответ или решение

Для того чтобы отфильтровать один датафрейм на основе значений другого датафрейма в библиотеке Pandas, можно использовать несколько различных методов. В приведенном вами сценарии у нас есть два датафрейма:

  1. Датафрейм df, загруженный из CSV-файла, который содержит три столбца: RepID, Account, и Rank.
  2. Датафрейм dE, который содержит только один столбец RepID.

Наша цель — создать два новых датафрейма:

  • dX, который будет содержать все записи из df, RepID которых не присутствуют в dE.
  • dY, который будет содержать записи, где RepID присутствует в dE.

Решение с использованием метода isin() и булевой индексации

В Pandas мы можем легко достичь желаемого результата, используя метод isin() и булевую индексацию.

Вот пошаговое руководство:

  1. Импортируйте библиотеку Pandas:
    Если вы ещё не импортировали Pandas, сделайте это:

    import pandas as pd
  2. Загрузите данные из CSV-файлов в датафреймы:

    df = pd.read_csv('путь_к_вашему_csv1.csv')
    dE = pd.read_csv('путь_к_вашему_csv2.csv')
  3. Создайте датафрейм dY с записями, которые соответствуют RepID из dE:

    dY = df[df['RepID'].isin(dE['RepID'])]
  4. Создайте датафрейм dX с записями, которые не соответствуют RepID из dE:

    dX = df[~df['RepID'].isin(dE['RepID'])]

Пояснение к коду

  • Метод isin() проверяет, содержится ли значение в указанной серии или списке. Этот метод возвращает логический массив, который мы можем использовать для фильтрации датафрейма.
  • Мы используем ~ (логическое отрицание) для того, чтобы получить записи, которые не содержатся в dE.

Пример вывода

После выполнения указанных выше шагов ваши датафреймы dY и dX будут выглядеть следующим образом:

  • dY (содержит записи с RepID, имеющимся в dE):
   RepID Account  Rank
0    345    Zyxw     2
  • dX (содержит записи с RepID, отсутствующим в dE):
   RepID Account  Rank
0    123    Abcd     1
1    567    Hijk     3
2    837    Kjsj     8

Заключение

Данный подход с использованием метода isin() и булевой индексации является одним из самых простых и эффективных способов фильтрации данных в Pandas. Убедитесь, что ваши датафреймы загружаются корректно и не содержат пропущенных значений в столбце RepID, так как это может повлиять на результаты фильтрации.

Оцените материал
Добавить комментарий

Капча загружается...