10-Python Pandas去重

Pandas去重函数:drop_duplicates()

“去重”通过字面意思不难理解,就是删除重复的数据。在一个数据集中,找出重复的数据删并将其删除,最终只保存一个唯一存在的数据项,这就是数据去重的整个过程。删除重复数据是数据分析中经常会遇到的一个问题。通过数据去重,不仅可以节省内存空间,提高写入性能,还可以提升数据集的精确度,使得数据集不受重复数据的影响。

Panda DataFrame 对象提供了一个数据去重的函数 drop_duplicates(),本节对该函数的用法做详细介绍。

函数格式

drop_duplicates()函数的语法格式如下:

df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)

参数说明如下:

  • subset:表示要进去重的列名,默认为 None。
  • keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
  • inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。

实际应用

首先创建一个包含有重复值的 DataFrame 对象,如下所示:

import pandas as pd

data = {

    'A': [1, 0, 1, 1],
    'B': [0, 2, 5, 0],
    'C': [4, 0, 4, 4],
    'D': [1, 0, 1, 1]
}
df = pd.DataFrame(data=data)
print(df)

输出结果:

   A  B  C  D
0  1  0  4  1
1  0  2  0  0
2  1  5  4  1
3  1  0  4  1
1) 默认保留第一次出现的重复项
import pandas as pd

data = {

    'A': [1, 0, 1, 1],
    'B': [0, 2, 5, 0],
    'C': [4, 0, 4, 4],
    'D': [1, 0, 1, 1]
}
df = pd.DataFrame(data=data)
print(df.drop_duplicates())

输出结果:

   A  B  C  D
0  1  0  4  1
1  0  2  0  0
2  1  5  4  1
2) keep=False删除所有重复项
import pandas as pd

data = {

    'A': [1, 0, 1, 1],
    'B': [0, 2, 5, 0],
    'C': [4, 0, 4, 4],
    'D': [1, 0, 1, 1]
}
df = pd.DataFrame(data=data)
print(df.drop_duplicates(keep=False))

输出结果:

   A  B  C  D
1  0  2  0  0
2  1  5  4  1
3) 根据指定列标签去重
import pandas as pd

data = {

    'A': [1, 3, 3, 3],
    'B': [0, 1, 2, 0],
    'C': [4, 5, 4, 4],
    'D': [3, 3, 3, 3]
}
df = pd.DataFrame(data=data)
print(df)
# 去除所有重复项,对于B列来说两个0是重复项
#df.drop_duplicates(subset=['B'], keep=False)
# 简写,省去subset参数
# df.drop_duplicates(['B'],keep=False)
print(df.drop_duplicates(subset=['B'], keep=False))

输出结果:

   A  B  C  D
0  1  0  4  3
1  3  1  5  3
2  3  2  4  3
3  3  0  4  3
   A  B  C  D
1  3  1  5  3
2  3  2  4  3

从上述示例可以看出,删除重复项后,行标签使用的数字是原来的,并没有从 0 重新开始,那么我们应该怎么从 0 重置索引呢?Pandas 提供的 reset_index() 函数会直接使用重置后的索引。如下所示:

import pandas as pd

data = {

    'A': [1, 3, 3, 3],
    'B': [0, 1, 2, 0],
    'C': [4, 5, 4, 4],
    'D': [3, 3, 3, 3]
}
df = pd.DataFrame(data=data)
# 去除所有重复项,对于B来说两个0是重复项
df = df.drop_duplicates(subset=['B'], keep=False)
# 重置索引,从0重新开始
print(df.reset_index(drop=True))

输出结果:

   A  B  C  D
0  3  1  5  3
1  3  2  4  3
4) 指定多列同时去重

创建一个 DataFrame 对象,如下所示:

import numpy as np
import pandas as pd
df = pd.DataFrame({'Country ID':[1,1,2,12,34,23,45,34,23,12,2,3,4,1],
                    'Age':[12,12,15,18, 19, 25, 21, 25, 25, 18, 25,12,32,18],
                   'Group ID':['a','z','c','a','b','s','d','a','b','s','a','d','a','f']})
#last只保留最后一个重复项

print("去重之前:\n",df)
print("去重之后:\n",df.drop_duplicates(['Age','Group ID'],keep='last'))

输出结果:

去重之前:
     Country ID  Age Group ID
0            1   12        a
1            1   12        z
2            2   15        c
3           12   18        a
4           34   19        b
5           23   25        s
6           45   21        d
7           34   25        a
8           23   25        b
9           12   18        s
10           2   25        a
11           3   12        d
12           4   32        a
13           1   18        f
去重之后:
     Country ID  Age Group ID
0            1   12        a
1            1   12        z
2            2   15        c
3           12   18        a
4           34   19        b
5           23   25        s
6           45   21        d
8           23   25        b
9           12   18        s
10           2   25        a
11           3   12        d
12           4   32        a
13           1   18        f

上述数据集中,第 7 行、第 10 行对应的列标签数据相同,我们使用参数值“last”保留最后一个重复项,也就是第 10 行数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值