Функция 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 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 技术
Пояснение к коду:
- В исходных данных строка 0 и строка 2 полностью совпадают (Чжан Сань, 25 лет, отдел технологий).
- Строка 1 и строка 4 также в точности совпадают (Ли Сы, 30 лет, отдел маркетинга).
- Использование
drop_duplicates()с параметрами по умолчанию дублирующиеся строки удаляются, а первое вхождение сохраняется.
Пример 2: Удаление дублирующихся строк на основе указанных столбцов
Вы можете использоватьsubsetпараметр для определения дубликатов только по конкретным столбцам.
Пример
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 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 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 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 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
Пояснение к коду:
- Исходные данные содержат 6 строк, среди которых 2 дублирующихся заказа (O001 и O002 встречаются дважды).
- Используйте
drop_duplicates(subset=['订单号'])Дедупликация по номеру заказа. - В сочетании с выбором столбцов
[['Order Number', 'Customer Name', 'Amount']], оставляйте только нужные столбцы.
Меры предосторожности
drop_duplicates()По умолчанию исходный DataFrame не изменяется; если вы хотите изменить его на месте, используйтеinplace=Trueпараметра.- Используйте
subsetПри использовании параметра дубликаты определяются только по указанным столбцам; значения в других столбцах не влияют на определение. - Используйте
keep=Falseудалит все дублирующиеся строки, что может привести к большой потере данных; используйте с осторожностью. - Перед удалением дублирующихся данных рекомендуется сначала проанализировать причину дубликатов, чтобы убедиться, что операция удаления соответствует бизнес-логике.
- Если в данных есть пропущенные значения (NaN), по умолчанию они будут рассматриваться как одно и то же значение при сравнении.
Другие расширения