检查Pandas Dataframe 列中的重复值

66bbxpm5  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(261)

**在Pandas中有没有一种方法可以检查 Dataframe 列是否有重复的值,而不需要删除行?**我有一个函数可以删除重复的行,但是,我只希望它在特定列中确实有重复值时运行。

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

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
mzaanser

mzaanser1#

主要问题

列中是否存在重复值,True/False

╔═════════╦═══════════════╗
║ Student ║ Date          ║
╠═════════╬═══════════════╣
║ Joe     ║ December 2017 ║
╠═════════╬═══════════════╣
║ Bob     ║ April 2018    ║
╠═════════╬═══════════════╣
║ Joe     ║ December 2018 ║
╚═════════╩═══════════════╝

假设上述 Dataframe (df),我们可以通过以下方式快速检查Student列中是否存在重复数据:

boolean = not df["Student"].is_unique      # True (credit to @Carsten)
boolean = df['Student'].duplicated().any() # True

进一步阅读和参考

上面我们使用的是Pandas系列的一种方法。PandasDataFrame有几个有用的methods,其中两个是:

  1. drop_duplicates(self[,subset,keep,inplace])- * 返回删除了重复行的DataFrame,也可以只考虑某些列。*
  2. duplicated(self[,subset,keep])- * 返回表示重复行的布尔Series,可选地仅考虑某些列。*
    这些方法可以作为一个整体应用于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参数,我们通常可以跳过几行直接访问我们需要的内容:
保留:{“第一个”,“最后一个”,False},默认值为“第一个”

  • 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
x8diyxa7

x8diyxa72#

您可以使用is_unique

df['Student'].is_unique

# equals true in case of no duplicates

需要更老的Pandas版本:

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

v7pvogib3#

如果您想知道有多少重复项以及它们使用的是什么:

df.pivot_table(index=['ColumnName'], aggfunc='size')

df.pivot_table(index=['ColumnName1',.., 'ColumnNameN'], aggfunc='size')
p5fdfcr1

p5fdfcr14#

除了DataFrame.duplicatedSeries.duplicated,Pandas还有DataFrame.anySeries.any

import pandas as pd

df = pd.read_csv("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv")

在Python ≥3.8的情况下,检查重复项并访问一些重复行:

if (duplicated := df.duplicated(keep=False)).any():
    some_duplicates = df[duplicated].sort_values(by=df.columns.to_list()).head()
    print(f"Dataframe has one or more duplicated rows, for example:\n{some_duplicates}")

相关问题