Функция df.drop_duplicates() в Pandas

Часто используемые функции Pandas


df.drop_duplicates()Это функция в Pandas, используемая для удаления дублирующихся строк.

Во время сбора и интеграции данных дублирование данных — распространённая проблема.drop_duplicates()Она может помочь выявить и удалить дублирующиеся строки на основе указанных столбцов или всех столбцов, сохраняя первое или последнее вхождение. Это очень полезно для дедупликации данных и обеспечения уникальности данных.


Базовый синтаксис и параметры

drop_duplicates()Это метод DataFrame, вызываемый через оператор точка.для вызова.

Формат синтаксиса

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)

Описание параметра

Параметр Type Обязательный Описание Значение по умолчанию
подмножество метка столбца или список Optional Укажите столбец(ы), используемые для определения дубликатов. Если этоNone, используются все столбцы. Это может быть имя одного столбца или список имён столбцов. Отсутствует
keep str или False Optional Укажите, какую дублирующую запись сохранить.'first'Сохранить первую;'last'Сохранить последнюю;FalseУдалить все дублирующиеся записи. 'first'
inplace bool Optional Если он равенTrue, изменяет исходный DataFrame напрямую и не возвращает новый объект; если он равенFalse, возвращает новый DataFrame, а исходные данные остаются неизменными. False
ignore_index bool Optional Если он равенTrue, сбрасывает индекс результата, начиная с 0; если он равенFalse, сохраняет исходный индекс. False

Описание возвращаемого значения

  • Возвращает новый DataFrame (еслиinplace=False), илиNone(еслиinplace=True)。
  • Возвращаемый DataFrame не содержит дублирующихся строк.

Примеры

Давайте тщательно освоим на ряде примеровdrop_duplicates()использование.

Пример 1: Удаление полностью дублирующихся строк

По умолчанию все столбцы используются для определения, является ли строка дубликатом.

Пример

import pandas as pd
import numpy as np

# Создать DataFrame, содержащий дублирующиеся строки
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Чжан Сань', 'Ван У', 'Ли Сы'],
    'Age': [25, 30, 25, 35, 30],
    'Отдел': ['Технологии', 'Маркетинг', 'Технологии', 'Технологии', 'Маркетинг']
}
df = pd.DataFrame(data)

print(Исходные данные:)
print(df)
print("=" * 50)

# Удалить дублирующиеся строки, сохранить первое вхождение
df_cleaned = df.drop_duplicates()

print(Данные после удаления дублирующихся строк:)
print(df_cleaned)

Ожидаемый вывод:

原始数据:
    姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
2  张三   25  技术
3  王五   35  技术
4  李四   30  市场
==================================================
删除重复行后的数据:
    0  姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
3  王五   35  技术

Пояснение к коду:

  1. В исходных данных строка 0 и строка 2 полностью совпадают (Чжан Сань, 25 лет, отдел технологий).
  2. Строка 1 и строка 4 также в точности совпадают (Ли Сы, 30 лет, отдел маркетинга).
  3. Использованиеdrop_duplicates()с параметрами по умолчанию дублирующиеся строки удаляются, а первое вхождение сохраняется.

Пример 2: Удаление дублирующихся строк на основе указанных столбцов

Вы можете использоватьsubsetпараметр для определения дубликатов только по конкретным столбцам.

Пример

import pandas as pd
import numpy as np

# Создать DataFrame
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Чжан Сань', 'Wang Wu'],
    'Age': [25, 30, 28, 35],  # Чжан Сань встречается дважды, но с разным возрастом
    'Отдел': ['Технологии', 'Маркетинг', 'Технологии', 'Marketing']
}
df = pd.DataFrame(data)

print(Исходные данные:)
print(df)
print("=" * 50)

# Определить дубликаты только по столбцу "Name"
df_cleaned = df.drop_duplicates(subset=['Name'])

print(Данные после удаления дубликатов на основе столбца Name:)
print(df_cleaned)
print("=" * 50)

# Определить дубликаты на основе столбцов "Name" и "Department"
df_cleaned2 = df.drop_duplicates(subset=['Name', 'Department'])

print(Данные после удаления дубликатов на основе столбцов Name и Department:)
print(df_cleaned2)

Ожидаемый вывод:

原始数据:
    姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
2  张三   28  技术  # 虽然姓名重复,但年龄不同
3  王五   35  市场
==================================================
根据姓名列删除重复后的数据:
    姓名  年龄  部门
0  张三   25  技术  # 保留第一条张三的记录
2  张三   28  技术
3  王五   35  市场
==================================================
根据姓名和部门列删除重复后的数据:
     参数
姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
3  王五   35  市场

Пояснение к коду:

  • При определении дубликатов на основе столбца Name строки 0 и 2 обе имеют имя "Zhang San" и считаются дублирующими строками, поэтому сохраняется только строка 0.
  • При определении дубликатов на основе обоих столбцов Name и Department строки 0 и 2 имеют одинаковые Name и Department, поэтому сохраняется строка 0.

Пример 3: Сохранить последнюю дублирующую запись

Использованиеkeep='last'параметр сохраняет последнюю встречающуюся дублирующую запись.

Пример

import pandas as pd
import numpy as np

# Создать DataFrame, содержащий дублирующиеся строки
data = {
    'Student ID': ['S001', 'S002', 'S001', 'S003', 'S002'],
    'Имя': ['Чжан Сань', 'Ли Сы', 'Чжан Сань', 'Ван У', 'Ли Сы'],
    'Score': [85, 90, 88, 92, 85]  # Один и тот же Student ID может иметь разные баллы
}
df = pd.DataFrame(data)

print(Исходные данные:)
print(df)
print("=" * 50)

# Сохранить первую запись (по умолчанию)
df_first = df.drop_duplicates(subset=['Student ID'], keep='first')

print(Сохранение первой дублирующей записи:)
print(df_first)
print("=" * 50)

# Оставить последнюю запись
df_last = df.drop_duplicates(subset=['Student ID'], keep='last')

print(Сохранение последней дублирующей записи:)
print(df_last)

Ожидаемый вывод:

原始数据:
    学号  姓名  成绩
0  S001  张三     85
1  S002  李四     90
2  S001  张三     88  # 同一个人,成绩不同
3  S王五   92
4  S002  李四     85  # 同一个人,成绩不同
==================================================
保留第一条重复记录:
    学号  姓名  成绩
0  S001 张三     85  # 保留第一个85分
1  S002  李四     90  # 保留第一个90分
3  王五   92
==================================================
保留最后一条重复记录:
    学号  姓名  成绩
2  S001  张三     88  # 保留最后一个88分
3  王五   92
4  S002  李四     85  # 保留最后一个85分

Пояснение к коду:

  • Student ID S001 имеет две записи с оценками 85 и 88; используяkeep='first'оставляет запись с оценкой 85,keep='last'оставляет запись с оценкой 88.
  • Student ID S002 также имеет две записи, с оценками 90 и 85.
  • Выберите, сохранять ли первую или последнюю запись в соответствии с потребностями бизнеса.
  • Пример 4: Удаление всех дубликатов записей

    Использованиеkeep=Falseудаляет все дубликаты записей, оставляя только полностью уникальные строки.

    Пример

    import pandas as pd
    import numpy as np

    # Создать DataFrame
    data = {
        'A': [1, 1, 2, 2, 3],
        'B': [1, 1, 2, 2, 3],
        'C': [1, 2, 3, 3, 5]
    }
    df = pd.DataFrame(data)

    print(Исходные данные:)
    print(df)
    print("=" * 50)

    # Удалить все дублирующиеся строки (не оставлять дубликаты)
    df_cleaned = df.drop_duplicates(keep=False)

    print(Данные после удаления всех дублирующихся строк:)
    print(df_cleaned)

    Ожидаемый вывод:

    原始数据:
       A  B  C
    0  1  1  1
    1  1  1  2  # 与第0行A和B相同,是重复行
    2  2  2  3
    3  2  2  3  # 与第2行完全相同,是重复行
    4  3  3  5
    ==================================================
    删除所有重复行后的数据:
       A  B  C
    4  3  3  5
    

    Пояснение к коду:

    • Строки 0 и 1 имеют одинаковые значения в столбцах A и B, что делает их дублирующимися строками; посколькуkeep=Falseобе удаляются.
    • Строки 2 и 3 также полностью дублированы, и обе удаляются.
    • Только строка 4 полностью уникальна и сохраняется.

    Пример 5: Сброс индекса

    После удаления дублирующихся строк исходный индекс может стать не непрерывным; можно использоватьignore_index=Trueчтобы сбросить индекс.

    Пример

    import pandas as pd
    import numpy as np

    # Создать DataFrame, содержащий дублирующиеся строки
    data = {
        'Имя': ['Чжан Сань', 'Ли Сы', 'Чжан Сань', 'Wang Wu'],
        'City': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou']
    }
    df = pd.DataFrame(data)

    print(Исходные данные:)
    print(df)
    print("=" * 50)

    # Удалить дублирующиеся строки без сброса индекса
    df_cleaned1 = df.drop_duplicates()

    print(Удалить дублирующиеся строки (сохранить исходный индекс):)
    print(df_cleaned1)
    print("=" * 50)

    # Удалить дублирующиеся строки и сбросить индекс
    df_cleaned2 = df.drop_duplicates(ignore_index=True)

    print(Удалить дублирующиеся строки (сбросить индекс):)
    print(df_cleaned2)

    Ожидаемый вывод:

    原始数据:
        姓名  城市
    0  张三  北京
    1  李四  上海
    2  张三  北京
    3  王五  广州
    ==================================================
    删除重复行(保留原始索引):
        姓名  城市
    0  张三  北京
    1  李四  上海
    3  王五  广州
    ==================================================
    删除重复行(重置索引):
        姓名  城市
    0  张三  北京
    1  李四  上海
    2  王五  广州
    

    Пояснение к коду:

    • Без использованияignore_index, после удаления строки 2 индекс равен 0, 1, 3, что не является непрерывным.
    • Использованиеignore_index=True, индекс начинается заново с 0, в результате чего получается 0, 1, 2.

    Пример 6: Совмещение с другими операциями

    drop_duplicates()Его можно использовать в сочетании с другими операциями DataFrame.

    Пример

    import pandas as pd
    import numpy as np

    # Имитация данных, полученных из запроса к базе данных
    data = {
        'Order ID': ['O001', 'O002', 'O001', 'O003', 'O002', 'O004'],
        'Customer Name': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si', 'Zhao Liu'],
        'Amount': [100, 200, 100, 300, 200, 400],
        'Date': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-03', '2024-01-02', '2024-01-04']
    }
    df = pd.DataFrame(data)

    print("Исходные данные заказа:")
    print(df)
    print("=" * 50)

    # Проверить, сколько дублирующихся заказов
    print(f"Всего строк: {len(df)}")
    print(f"Строк после удаления дубликатов: {len(df.drop_duplicates())}")
    print(f"Количество дублирующихся строк: {len(df) - len(df.drop_duplicates())}")
    print("=" * 50)

    # Собственно, дедуплицируем, сохраняем первую запись и оставляем только нужные столбцы
    df_unique = df.drop_duplicates(subset=['Order ID'])[['Order ID', 'Customer Name', 'Amount']]

    print("Дедуплицированные данные заказов:")
    print(df_unique)

    Ожидаемый вывод:

    原始订单数据:
        订单号  客户名  金额   日期
    0  O001    张三  100  2024-01-01
    1  O002    李四  200  2024-01-02
    2  O001    张三  100  2024-01-01  # 重复订单
    3  O003    王五  300  2024-01-03
    4  O002    李四  200  2024-01-02  # 重复订单
    5  O004    赵六  400  2024-01-04
    ================================================++
    总行数: 6
    去重后行数: 4
    重复行数: 2
    

    Пояснение к коду:

    1. Исходные данные содержат 6 строк, среди которых 2 дублирующихся заказа (O001 и O002 встречаются дважды).
    2. Используйтеdrop_duplicates(subset=['订单号'])Дедупликация по номеру заказа.
    3. В сочетании с выбором столбцов[['Order Number', 'Customer Name', 'Amount']], оставляйте только нужные столбцы.

    Меры предосторожности

    • drop_duplicates()По умолчанию исходный DataFrame не изменяется; если вы хотите изменить его на месте, используйтеinplace=Trueпараметра.
    • ИспользуйтеsubsetПри использовании параметра дубликаты определяются только по указанным столбцам; значения в других столбцах не влияют на определение.
    • Используйтеkeep=Falseудалит все дублирующиеся строки, что может привести к большой потере данных; используйте с осторожностью.
    • Перед удалением дублирующихся данных рекомендуется сначала проанализировать причину дубликатов, чтобы убедиться, что операция удаления соответствует бизнес-логике.
    • Если в данных есть пропущенные значения (NaN), по умолчанию они будут рассматриваться как одно и то же значение при сравнении.

    Часто используемые функции Pandas

    Другие расширения