#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. Я добавил объяснение. Вы можете запустить обе версии шаг за шагом и посмотреть, как возвращаются логические значения для обеих версий.