检查 Pandas 数据框列中的重复值

新手上路,请多包涵

pandas 中是否有一种方法可以检查数据框列是否具有重复值,而不实际删除行? 我有一个函数可以删除重复的行,但是,我只希望它在特定列中实际存在重复项时运行。

目前,我将列中唯一值的数量与行数进行比较:如果唯一值的数量少于行数,则存在重复项并且代码运行。

  if len(df['Student'].unique()) < len(df.index):
    # Code to remove duplicates based on Date column runs

使用 pandas 是否有更简单或更有效的方法来检查特定列中是否存在重复值?

我正在使用的一些示例数据(仅显示两列)。如果找到重复项,则另一个函数确定要保留哪一行(日期最早的行):

     Student Date
0   Joe     December 2017
1   James   January 2018
2   Bob     April 2018
3   Joe     December 2017
4   Jack    February 2018
5   Jack    March 2018

原文由 Jeff Mitchell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 604
2 个回答

主要问题

列中是否有重复值 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 系列方法之一。 pandas DataFrame 有几个有用的 方法,其中两个是:

  1. drop_duplicates (self[, subset, keep, inplace]) - 返回删除了重复行的 DataFrame,可选地只考虑某些列。
  2. 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 :删除除了最后一次出现的重复项。
  • False :删除所有重复项。

玩弄的例子

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

原文由 Anton vBR 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 is_unique

 df['Student'].is_unique

# equals true in case of no duplicates

需要较旧的熊猫版本:

 pd.Series(df['Student']).is_unique

原文由 Carsten 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏