Устранение дубликатов на основе условий в фрейме данных - PullRequest
2 голосов
/ 21 сентября 2019

Это мой фрейм данных:

Fruits         Person        Eat

Banana         Peter         Yes 
Banana         Ashley        Yes
Strawberry     Peter         No
Strawberry     Ashley        Yes 
Cherry         Peter         Yes
Orange         Peter         No
Orange         Ashley        No
Grape          Ashley        Yes
Pear           Ashley        Yes
Pear           Peter         Yes

В моем фрейме данных есть дубликаты фруктов.Мне нужно удалить дубликаты на основе следующей логики.Если есть дублированный фрукт, и Питер и Эшли оба его едят, то строка Питера сохраняется, а строка Эшли удаляется.Если есть повторяющиеся фрукты, и Питер не ест их, а Эшли ест их, то строка Питера удаляется, а строка Эшли остается.Если есть повторяющиеся фрукты, и Питер не ест их, а Эшли не ест их, тогда удаляются обе строки.

С этой логикой фрейм данных должен выводить как:

Fruits         Person        Eat

Banana         Peter         Yes 
Strawberry     Ashley        Yes 
Cherry         Peter         Yes
Grape          Ashley        Yes
Pear           Peter         Yes

Я не уверен, как перебрать фрейм данных pandas с этими условиями, чтобы удалить дубликаты.Как правило, для первого условия я бы сделал что-то вроде этого:

data = [
    {
        "fruit": "Apple",
        "person": "Ashley",
        "eats": True
    },
    {
        "fruit": "Apple",
        "person": "Peter",
        "eats": True
    }
]
eats = dict()

for i, row in enumerate(data):
    fruit = row["fruit"]
person = row["person"]
does_eat = row["eats"]
# mark whether person eats fruit
if not eats.get(person):
    eats[person] = dict()

# if person does eat, record row number for later deletion if needed if does_eat:
eats[person][fruit] = i

# dedup
if person == "Peter" and eats.get("Peter") and eats["Peter"].get(fruit):
    data.pop(eats["Ashley"][fruit])
elif person == "Ashley" and eats.get("Peter") and eats["Peter"].get(fruit):
    data.pop(i)

Любая помощь / советы о том, как сделать это с моим фреймом данных, будет очень признательна.

1 Ответ

0 голосов
/ 21 сентября 2019

Попробуйте это:

df1 = (df[df.Eat.eq('Yes')].sort_values('Person')
                           .drop_duplicates(subset='Fruits', keep='last'))

Out[14]:
       Fruits  Person  Eat
3  Strawberry  Ashley  Yes
7       Grape  Ashley  Yes
0      Banana   Peter  Yes
4      Cherry   Peter  Yes
9        Pear   Peter  Yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...