Проверьте разницу в одном столбце на основе дублированных значений в двух других столбцах

#python #pandas

Вопрос:

У меня есть такой пример фрейма данных, как этот.

 animal  color  price
rabit   red    10
turtle  green  15
rabit   red    12
turtle  green  15
turtle  green  10
sheep   white  5
sheep   white  5
 

Если значения в животном и цвете такие же, как в строке 1 и строке 3, но цена отличается, верните строки с другой ценой. Результаты должны быть примерно такими:

 animal  color  price
rabit   red    10
rabit   red    12
turtle  green  15
turtle  green  10
 

Спасибо.

Комментарии:

1. Пожалуйста, добавьте соответствующие теги, это могут быть панды, писпарк или что-то еще

2. Привет, я новичок в python, поэтому я не знаком с пакетами. Любая функция, которая может решить проблему, будет в порядке.

3. вы используете фрейм данных pandas, верно? есть ли у вас import pandas as pd в верхней части кода?

4. Да, я использую панд и numpy

5. Добавлено решение и подробное объяснение причины, по которой порядок использования 2 операторов имеет значение. Отметьте ответ, если он решил вашу проблему! Спасибо!

Ответ №1:

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

Обязательно используйте drop_duplicates() первый, перед использованием pd.duplicated с keep=False , по назначению.

 out = df.drop_duplicates()
out = out[out.duplicated(subset=['animal','color'], keep=False)]
print(out)
 
    animal  color  price
0   rabit    red     10
1  turtle  green     15
2   rabit    red     12
4  turtle  green     10
 

ПРИМЕЧАНИЕ!!: Если вы используете drop_duplicates() в качестве второго шага, вы получите неожиданный результат, как показано ниже.

 out = df[df.duplicated(subset=['animal','color'], keep=False)]
out = out.drop_duplicates()
print(out)
 
    animal  color  price
0   rabit    red     10
1  turtle  green     15
2   rabit    red     12
4  turtle  green     10
5   sheep  white      5
 

Почему это происходит?

Интуитивно drop_duplicates() удаляет дубликаты на основе всех столбцов вместе и df.duplicated(keep=False) помечает все дубликаты на основе 2 заданных столбцов.

Сценарий 1: Удалите все строки с одинаковыми 2 столбцами и ценой, затем сохраните дубликаты на основе 2 столбцов > Это означает, что у вас останутся строки с разными ценами, но дублирующие 2 столбца.

Сценарий 2: Сохраните все строки, которые дублируются, на основе 2 столбцов (что ничего не удалит в этом примере). Затем отбросьте повторяющиеся строки, в которых цена одинакова. В итоге получается то же самое, что просто отбрасывать повторяющиеся строки по всем столбцам.

Ответ №2:

Вы можете использовать эту duplicated функцию для получения требуемых выходных данных. Как только вы это сделаете, вы можете использовать функцию drop_duplicates для удаления строк, которые полностью похожи.

 duplicates = df[df.duplicated(subset=['animal','color', keep = False)]
duplicates = duplicates.drop_duplicates()

print(duplicates)
 

Комментарии:

1. Я пробовал это, но это также показывает низкую цену. Я хочу вернуть только другое значение в цене, как показано в результате.

2. Я обновил свой ответ, удовлетворяющий этому условию @CouchTomato

3. Это тоже не сработает. сначала нужно удалить дубликаты, а затем df.дублировать с правильной работой. Пожалуйста, обратитесь к моему ответу.

4. Почему порядок удаления дубликатов будет иметь значение?

5. Я добавил объяснение. Вы можете запустить обе версии шаг за шагом и посмотреть, как возвращаются логические значения для обеих версий.