Как использовать группу pandas для фильтрации этого фрейма данных?

Используя Python, как вы можете использовать группу для фильтрации этого набора данных

Начинать

First     Last     Location      ID1              ID2             First3   Last3
John      Smith    Toronto       JohnToronto      SmithToronto    Joh      Smi
Joh       Smith    Toronto       JohToronto       SmithToronto    Joh      Smi
Steph     Sax      Vancouver     StephVancouver   SaxVancouver    Ste      Sax
Steph     Sa       Vancouver     StephVancouver   SaxeVancouver   Ste      Sax 
Stacy     Lee      Markham       StacyMarkham     LeeMarkham      Sta      Lee
Stac      Lee      Markham       StacMarkham      LeeMarkham      Sta      Lee
Stac      Wong     Aurora        StacAurora       LeeAurora       Sta      Won
Stac      Lee      Newmarket     StacNewmarket    LeeNewmarket    Sta      Lee
Steve     Smith    Toronto       SteveToronto     SmithToronto    Ste      Smi
John      Jones    Toronto       JohnToronto      JonesToronto    Joh      Jon

Как я могу сделать так, чтобы там, где принимаются два условия, отфильтровывалось все остальное, что не соответствует этим двум критериям

  • ID1 — соответствует другому ID1, а Last3 совпадают
  • ID2 — соответствует другому ID2, и первые 3 совпадают

Конец

 First     Last     Location      ID1              ID2             First3   Last3
 John      Smith    Toronto       JohnToronto      SmithToronto    Joh      Smi
 Joh       Smith    Toronto       JohToronto       SmithToronto    Joh      Smi
 Steph     Sax      Vancouver     StephVancouver   SaxVancouver    Ste      Sax
 Steph     Sa       Vancouver     StephVancouver   SaxeVancouver   Ste      Sax 
 Stacy     Lee      Markham       StacyMarkham     LeeMarkham      Sta      Lee
 Stac      Lee      Markham       StacMarkham      LeeMarkham      Sta      Lee

что ты имеешь в виду под моими "последними тремя одинаковыми"? То же, что? Непонятно, что вы пытаетесь сгруппировать и агрегировать. Вам нужно сгруппировать по каждому местоположению? Первый? Прошлой?

Akshay Sehgal 16.05.2022 21:30

значение столбца last3 совпадает. пытаясь сгруппировать по ID1 или ID2. И затем в зависимости от того, какой фильтр ID, если столбец Last3 и столбец First3 совпадают соответственно

OptimusPrime 16.05.2022 21:38

Имеет смысл. Итак, группируйте по ID1, затем проверяйте дубликаты Last3.. аналогично группируйте по ID2, проверяйте дубликаты First3.. наконец, возвращайте строки, которые соответствуют любому из двух условий. Проверьте мой подход, который должен соответствовать тому, что вы ищете с помощью groupby.

Akshay Sehgal 16.05.2022 21:53

Также добавлена ​​модификация ответа @somedude без группировки.

Akshay Sehgal 16.05.2022 22:08
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
4
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать:

df = pd.DataFrame({
    'First':['John', 'Joh', 'Steph', 'Steph', 'Stacy', 'Stac', 'Stac', 'Stac', 'Steve', 'John'],
    'Last':['Smith', 'Smith', 'Sax', 'Sa', 'Lee', 'Lee', 'Wong', 'Lee', 'Smith', 'Jones'],
    'Location':['Toronto', 'Toronto', 'Vancouver', 'Vancouver', 'Markham', 
                'Markham', 'Aurora', 'Newmarket', 'Toronto', 'Toronto'],
    'ID1':['JohnToronto', 'JohnToronto', 'StephVancouver', 'StephVancouver', 'StacyMarkham',
          'StacyMarkham','StacAurora', 'StacNewmarket','SteveToronto','JohnToronto'],
    'ID2':['SmithToronto','SmithToronto','SaxVancouver','SaxVancouver',
          'LeeMarkham','LeeMarkham','LeeAurora','LeeNewmarket','SmithToronto','JonesToronto'],
    
    'First3':['Joh','Joh','Ste','Ste','Sta','Sta','Sta','Sta','Ste','Joh'],
    'Last3':['Smi','Smi','Sax','Sax','Lee','Lee','Won','Lee','Smi','Jon']
})
m1 = df.duplicated(subset=['ID1','Last3'],keep=False)
m2 = df[m1].duplicated(subset=['ID2','First3'],keep=False)
df = df[m1 & m2]

Я получаю набор данных, полный ничего?

OptimusPrime 16.05.2022 21:39

Можете ли вы попробовать выполнить код, который я обновил в ответе, и посмотреть?

SomeDude 16.05.2022 21:40

предварительная фильтрация df по индексу m1 при вычислении m2 делает его условием И, а не условием ИЛИ, которое запрашивает OP. Кроме того, если вы измените последний лайк на df[m1], если вы получите тот же результат, что и df[m1 & m2]

Akshay Sehgal 16.05.2022 21:59

@AkshaySehgal Вопрос был мне не очень ясен. Но спасибо за разъяснение.

SomeDude 16.05.2022 22:21
Ответ принят как подходящий

На основе комментария для уточнения постановки задачи -

trying to groupby ID1 or ID2. And then depending which ID filter if Last3 col and First3 Col are the same respectively

Попробуйте этот подход -

#group by ID1 and check if duplicates in last3. Then extract the index number that satisfies condition
c1 = df.groupby('ID1').apply(pd.DataFrame.duplicated, subset=['Last3'], keep=False)
c1_idx = c1[c1].droplevel(0).index

#group by ID2 and check if duplicates in first3. Then extract the index number that satisfies condition
c2 = df.groupby('ID2').apply(pd.DataFrame.duplicated, subset=['First3'], keep=False)
c2_idx = c2[c2].droplevel(0).index

#take a union of the 2 indexes and then ..
#filter dataframe for the indexes that meet the 2 independent conditions
output = df.iloc[c1_idx.union(c2_idx)]
print(output)
   First   Last   Location             ID1            ID2 First3 Last3
0   John  Smith    Toronto     JohnToronto   SmithToronto    Joh   Smi
1    Joh  Smith    Toronto      JohToronto   SmithToronto    Joh   Smi
2  Steph    Sax  Vancouver  StephVancouver   SaxVancouver    Ste   Sax
3  Steph     Sa  Vancouver  StephVancouver  SaxeVancouver    Ste   Sax
4  Stacy    Lee    Markham    StacyMarkham     LeeMarkham    Sta   Lee
5   Stac    Lee    Markham     StacMarkham     LeeMarkham    Sta   Lee

Обновлено: Изменив приведенный выше ответ, предоставленный @SomeDude, вы можете запустить это как 2 независимых условия без группировки, а также использовать ИЛИ между ними -

m1 = df.duplicated(subset=['ID1','Last3'],keep=False)
m2 = df.duplicated(subset=['ID2','First3'],keep=False)
df[m1 | m2]

спасибо у меня получилось. Я использовал вашу правку. понять было намного легче.

OptimusPrime 16.05.2022 22:15

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