Как использовать группу 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
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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

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