主要问题
列中是否存在重复值,True/False?
╔═════════╦═══════════════╗
║ Student ║ Date ║
╠═════════╬═══════════════╣
║ Joe ║ December 2017 ║
╠═════════╬═══════════════╣
║ Bob ║ April 2018 ║
╠═════════╬═══════════════╣
║ Joe ║ December 2018 ║
╚═════════╩═══════════════╝
假设上述数据帧 (df),我们可以通过以下方式快速检查 Student col 中是否重复:
boolean = not df["Student"].is_unique # True (credit to @Carsten)
boolean = df['Student'].duplicated().any() # True
进一步阅读和参考
上面我们使用的是 Pandas Series 方法之一。 pandas DataFrame 有几个有用的methods,其中两个是:
-
drop_duplicates(self[, subset, keep, inplace]) - 返回删除重复行的DataFrame,可选地只考虑某些列。
-
duplicated(self[, subset, keep]) - 返回表示重复行的布尔系列,可选择仅考虑某些列。
这些方法可以作为一个整体应用于 DataFrame,而不仅仅是上面的 Serie(列)。相当于:
boolean = df.duplicated(subset=['Student']).any() # True
# We were expecting True, as Joe can be seen twice.
但是,如果我们对整个框架感兴趣,我们可以继续做:
boolean = df.duplicated().any() # False
boolean = df.duplicated(subset=['Student','Date']).any() # False
# We were expecting False here - no duplicates row-wise
# ie. Joe Dec 2017, Joe Dec 2018
最后一个有用的提示。通过使用keep 参数,我们通常可以跳过几行直接访问我们需要的内容:
keep : {‘first’, ‘last’, False}, 默认‘first’
- first :删除除第一次出现的重复项。
- last :删除除最后一次出现的重复项。
- 错误:删除所有重复项。
使用示例
import pandas as pd
import io
data = '''\
Student,Date
Joe,December 2017
Bob,April 2018
Joe,December 2018'''
df = pd.read_csv(io.StringIO(data), sep=',')
# Approach 1: Simple True/False
boolean = df.duplicated(subset=['Student']).any()
print(boolean, end='\n\n') # True
# Approach 2: First store boolean array, check then remove
duplicate_in_student = df.duplicated(subset=['Student'])
if duplicate_in_student.any():
print(df.loc[~duplicate_in_student], end='\n\n')
# Approach 3: Use drop_duplicates method
df.drop_duplicates(subset=['Student'], inplace=True)
print(df)
返回
True
Student Date
0 Joe December 2017
1 Bob April 2018
Student Date
0 Joe December 2017
1 Bob April 2018