Удаление строки в df1, если пара значений столбца не связана в другом df2

Учитывая df1 и df2, я хочу получить df3. Единственные столбцы/строки, которые я хочу сопоставить, это Поп и Дома. Я включил столбец данных Другой, чтобы получить решение для произвольного количества столбцов.

df1
City        Pop  Homes Other
City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      3     9
City_1      200      1     6
City_1      200      2     6
City_1      200      3     7
City_1      300      1     0

df2
City        Pop  Homes Other
City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      8     9
City_1      200      1     6
City_1      200      2     6
City_1      800      3     7
City_1      800      8     0

df3
City        Pop  Homes Other
City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      200      1     6
City_1      200      2     6

Я думал о группировке по городу, населению и домам, например df1.groupby(['Город', 'Население', 'Дома']), но тогда я не знаю, как отфильтровать неравенства Поп и Дома.

РЕДАКТИРОВАТЬ

Вот мой код, чтобы вы могли помочь мне проще.

df1_string = """City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      3     9
City_1      200      1     6
City_1      200      2     6
City_1      200      3     7
City_1      300      1     0"""

df2_string = """City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      8     9
City_1      200      1     6
City_1      200      2     6
City_1      800      3     7
City_1      800      8     0"""

df1 = pd.DataFrame([x.split() for x in df1_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])
df2 = pd.DataFrame([x.split() for x in df2_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])

df1_keys = [x for x in df1.groupby(['Pop', 'Homes']).groups.keys()]
df2_keys = [x for x in df2.groupby(['Pop', 'Homes']).groups.keys()]

print(df1_keys)
[('100', '1'), ('100', '2'), ('100', '3'), ('200', '1'), ('200', '2'), ('200', '3'), ('300', '1')]
print(df2_keys)
[('100', '1'), ('100', '2'), ('100', '8'), ('200', '1'), ('200', '2'), ('800', '3'), ('800', '8')]

Отсюда, казалось бы, просто отфильтровать пары групп, которые не равны, но я не могу это решить. Я пробовал:

df1 = df1[df1.groupby(['Pop', 'Homes']).groups.keys().isin(df2.groupby(['Pop', 'Homes']).groups.keys())]

И другие варианты этого, когда это не сработало - но я чувствую, что это близко к работе.

РЕШЕНИЕ

df1.set_index(['Pop', 'Homes'], inplace=True)
df2.set_index(['Pop', 'Homes'], inplace=True)

df1 = df1[df2.index.isin(df1.index)]

df1.reset_index(inplace=True)

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

Rich Andrews 08.04.2019 22:55

@RichAndrews Я внес правку. Теперь должно быть яснее

scrollout 09.04.2019 01:22

Выглядит отлично. Знаете ли вы, что люди «копируют» данные в буфер обмена своего компьютера и pandas.read_clipboard()? Супер удобно. Я думаю, что у вас тоже была попытка кода в вашем Q, нет причин исключать ее. Но у вас есть хорошие ответы на обзор!

Rich Andrews 09.04.2019 01:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC и если City, Pop, Home есть в индексе, то можно использовать isin:

df2[df2.index.isin(df1.index)]

Выход:

                 Count
City  Pop Homes       
City1 100 20       152
          24       184
      200 41       163
          42       163

Относятся ли эти df к объектам groupby, таким как: df1.groupby(['Город', 'Поп', 'Дома']) и df2.groupby(['Город', 'Поп', 'Дома'])?

scrollout 09.04.2019 01:47

да. Эта группа должна создать эту структуру index.

Scott Boston 09.04.2019 03:05

Это не работает, я получаю AttributeError: невозможно получить доступ к индексу атрибута объектов DataFrameGroupBy, попробуйте использовать метод «применить».

scrollout 09.04.2019 16:00

Создайте мультииндексы для фреймов данных и выполните внутреннее соединение для пересечения.

import pandas as pd
import numpy as np


df1_string = """City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      3     9
City_1      200      1     6
City_1      200      2     6
City_1      200      3     7
City_1      300      1     0"""

df2_string = """City_1      100      1     0
City_1      100      2     6
City_1      100      2     2
City_1      100      8     9
City_1      200      1     6
City_1      200      2     6
City_1      800      3     7
City_1      800      8     0"""

df1 = pd.DataFrame([x.split() for x in df1_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])
df2 = pd.DataFrame([x.split() for x in df2_string.split('\n')], columns=['City', 'Pop', 'Homes', 'Other'])

# Dataframes benefit from having indexes that reflect that tabular data
df1.set_index(['City', 'Pop', 'Homes'], inplace=True)
df2.set_index(['City', 'Pop', 'Homes'], inplace=True)

# an inner join on the multiindex will provide the intersaction of the two
result = df1.join(df2, how='inner', on=['City', 'Pop', 'Homes'], lsuffix='_l', rsuffix='_r')

# a join provides all of the joined columns
result.reset_index(inplace=True)
result.drop(['Other_r'], axis=1, inplace=True)
result.columns = ['City', 'Pop', 'Homes', 'Other']

print(result)

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