重复与去重
使用 pandas 解决数据的重复与去重问题。
数据重复
Index 对象
duplicated() 判断重复接口
语法:IndexObj.duplicated(keep="first")
,返回布尔值组成的 array
。
- keep 参数:
- 字符串
first
:默认值,第一次出现不标记。 - 字符串
last
:最后一次出现不标记。 - 布尔值
False
:重复的数据都标记上。
- 字符串
idx = pd.Index(['X', 'Y', 'X', 'Z', 'X'])
idx.duplicated()
# result bellow
array([False, False, True, False, True])
is_unique / has_duplicates 属性
IndexObj.is_unique
: True if Index 中没有重复项。IndexObj.has_duplicates
: True if Index 中有重复项。
Series 对象
duplicated() 判断重复接口
语法:SeriesObj.duplicated(keep="first")
,返回布尔值组成的 Series
。
- keep 参数:
- 字符串
first
:默认值,第一次出现不标记。 - 字符串
last
:最后一次出现不标记。 - 布尔值
False
:重复的数据都标记上。
- 字符串
ps = pd.Series(['X', 'Y', 'X', 'Z', 'X'], )
ps.duplicated(keep='last')
# result bellow
0 True
1 False
2 True
3 False
4 False
dtype: bool
is_unique 属性
SeriesObj.is_unique
: Return True 如果值没有重复项。
DataFrame 对象
duplicated() 判断重复接口
语法:DataFrameObj.duplicated(subset=None, keep="first")
,返回布尔值组成的 Series
。
- subset 参数:只有
Dataframe
可以使用的参数,用来选择判断重复的指标;默认值为 None 表示一行的所有值都相同才算重复;该参数可指定只要某些列相同就是重复。 - keep 参数:
- 字符串
first
:默认值,第一次出现不标记。 - 字符串
last
:最后一次出现不标记。 - 布尔值
False
:重复的数据都标记上。
- 字符串
df = pd.DataFrame({
'甲': ['X', 'X', 'Y', 'Y', 'Y'],
'乙': ['a', 'a', 'a', 'b', 'b'],
'丙': [1, 1, 2, 3, 5]
})
df.duplicated(subset="甲")
# result bellow
0 False
1 True
2 False
3 True
4 True
dtype: bool
数据去重
Index 对象
drop_duplicates() 删除重复项的接口
语法:IndexObj.drop_duplicates(可选参数)
,返回去重后的 新obj
,不修改 原obj
。
- keep 参数:
- 字符串
first
:默认值,保留第一次出现的; - 字符串
last
:保留最后一次出现的; - 布尔值
False
:重复项全部删除,不保留。
- 字符串
idx = pd.Index(['X', 'Y', 'X', 'Z', 'X', 'W'])
idx2 = idx.drop_duplicates(keep="last")
idx2
# result bellow
Index(['Y', 'Z', 'X', 'W'], dtype='object')
unique() 接口
语法:IndexObj.unique(level=None)
,Only return values from specified level (for MultiIndex). If int, gets the level by integer position, else by level name. 简单来说,返回指定级别的去重后索引值(新的 Index 对象)。
- level 参数:
- int,整型数据;
- hashable,可哈希数据,None 是可哈希的且为默认值。
idx2 = pd.Index([("A", "a"), ("A", "b"), ("B", "a"), ("B", "b")])
idx2.unique(level=1)
# result bellow
Index(['a', 'b'], dtype='object')
nunique() 接口
语法:IndexObj.nunique(dropna=True)
,去重后索引值的数目。
- dropna 参数:
- 布尔值
True
:默认值,NaN 不记录在内; - 布尔值
False
:NaN 记录在内。
- 布尔值
idx = pd.Index(list("甲乙丙丁戊甲乙丙"))
idx.nunique()
# result bellow
5
Series 对象
drop_duplicates() 删除重复项的接口
语法:SerriesObj.drop_duplicates(可选参数)
,可通过参数设置是否返回去重后的 新obj
,还是修改 原obj
。
- keep 参数:
- 字符串
first
:默认值,保留第一次出现的; - 字符串
last
:保留最后一次出现的; - 布尔值
False
:重复项全部删除,不保留。
- 字符串
- inplace 参数:
- 布尔值
False
:默认值,新建数据构型操作并返回。 - 布尔值
True
:原地操作,返回空值。
- 布尔值
- ignore_index 参数:
- 布尔值
False
:默认值,结果的 axis 保持。 - 布尔值
True
:结果的 axis 将重置为< 0, 1, …, n - 1>。
- 布尔值
s = pd.Series(['A', 'B', 'A', 'C', 'A', 'D'], index=list("甲乙丙丁戊己"), name="dr")
s.drop_duplicates(ignore_index=True) # 设置index重置
s
# result bellow
0 A
1 B
2 C
3 D
Name: dr, dtype: object
unique() 接口
语法:SeriesObj.unique()
,Return unique values of Series object. 根据数据类型返回指定的 Numpy Array,如 array、DateArray。
pd.Series([pd.Timestamp('2016-01-01') for _ in range(3)]).unique()
# result bellow
<DatetimeArray>
['2023-07-15 00:00:00']
Length: 1, dtype: datetime64[ns]
nunique() 接口
语法:SeriesObj.nunique(dropna=True)
,去重后值的数目。
- dropna 参数:
- 布尔值
True
:默认值,NaN 不记录在内; - 布尔值
False
:NaN 记录在内。
- 布尔值
idx = pd.Series(list("甲乙丙丁戊甲乙丙"))
idx.nunique()
# result bellow
5
DataFrame 对象
drop_duplicates() 删除重复项的接口
语法:DataFrameObj.drop_duplicates(可选参数)
,可通过参数设置是否返回去重后的 新obj
,还是修改 原obj
。
- subset 参数,选择判断重复的指标,默认一行的全部列相同才是重复:
- column label;
- sequence of labels。
- keep 参数:
- 字符串
first
:默认值,保留第一次出现的; - 字符串
last
:保留最后一次出现的; - 布尔值
False
:重复项全部删除,不保留。
- 字符串
- inplace 参数:
- 布尔值
False
:新建数据构型操作并返回。 - 布尔值
True
:原地操作,返回空值。
- 布尔值
- ignore_index 参数:
- 布尔值
False
:结果的 axis 保持。 - 布尔值
True
:结果的 axis 将重置为< 0, 1, …, n - 1>。
- 布尔值
df = pd.DataFrame({
'甲': ['X', 'X', 'Y', 'Y', 'Y'],
'乙': ['a', 'a', 'a', 'b', 'b'],
'丙': [1, 1, 2, 3, 5]
})
df.drop_duplicates(subset="甲", ignore_index=True)
# result bellow
甲 乙 丙
0 X a 1
1 Y a 2
nunique() 接口
语法:DataFrame.nunique(axis=0, dropna=True)
,Count number of distinct elements in specified axis. 计算指定坐标方向下的值,去重后数目,返回一个 Series
。
axis
参数:- 整数
0
:默认值,index,行坐标方向; - 整数
1
:columns,列坐标方向。
- 整数
dropna
参数:- 布尔值
True
:默认值,NaN 不记录在内; - 布尔值
False
:NaN 记录在内;
- 布尔值
df = pd.DataFrame({'A': [4, 5, 6], 'B': [4, 1, 1]})
df.nunique()
df.nunique(axi=1)
# result bellow 1
A 3
B 2
dtype: int64
# result bellow 2
0 1
1 2
2 2
dtype: int64