Используя 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
Как я могу сделать так, чтобы там, где принимаются два условия, отфильтровывалось все остальное, что не соответствует этим двум критериям
Конец
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
значение столбца last3 совпадает. пытаясь сгруппировать по ID1 или ID2. И затем в зависимости от того, какой фильтр ID, если столбец Last3 и столбец First3 совпадают соответственно
Имеет смысл. Итак, группируйте по ID1, затем проверяйте дубликаты Last3.. аналогично группируйте по ID2, проверяйте дубликаты First3.. наконец, возвращайте строки, которые соответствуют любому из двух условий. Проверьте мой подход, который должен соответствовать тому, что вы ищете с помощью groupby.
Также добавлена модификация ответа @somedude без группировки.
Вы можете использовать:
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]
Я получаю набор данных, полный ничего?
Можете ли вы попробовать выполнить код, который я обновил в ответе, и посмотреть?
предварительная фильтрация df по индексу m1 при вычислении m2 делает его условием И, а не условием ИЛИ, которое запрашивает OP. Кроме того, если вы измените последний лайк на df[m1]
, если вы получите тот же результат, что и df[m1 & m2]
@AkshaySehgal Вопрос был мне не очень ясен. Но спасибо за разъяснение.
На основе комментария для уточнения постановки задачи -
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]
спасибо у меня получилось. Я использовал вашу правку. понять было намного легче.
что ты имеешь в виду под моими "последними тремя одинаковыми"? То же, что? Непонятно, что вы пытаетесь сгруппировать и агрегировать. Вам нужно сгруппировать по каждому местоположению? Первый? Прошлой?