有没有办法检查数据帧列是否具有重复值而不丢弃行?我有一个删除重复行的函数,但是,如果特定列中实际存在重复项,我只希望它能够运行。
目前我将列中唯一值的数量与行数进行比较:如果唯一值少于行,则存在重复项并运行代码。
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
答案 0 :(得分:10)
以下是一个完整的例子:
import pandas as pd
import numpy as np
data = '''\
Student,Date
Joe,December 2017
James,January 2018
Bob,April 2018
Joe,December 2017
Jack,February 2018
Jack,March 2018'''
df = pd.read_csv(pd.compat.StringIO(data), sep=',') # <--- Recreate dataframe
print(any(df['Student'].duplicated())) # <--- Prints True
df['Date'] = pd.to_datetime(df.Date) # <--- Do this to get datetime
df = df.sort_values(by='Date').drop_duplicates('Student') # <--- Sort and drop
df['Date'] = df.Date.dt.strftime('%B %Y') # <--- Old date format
print(df)
返回
True
Student Date
0 Joe December 2017
1 James January 2018
4 Jack February 2018
2 Bob April 2018
我经常在大熊猫中说我们有兴趣创建布尔蒙版,即我们可以用来选择帧子集的True或False数组。在这种情况下,我们可以例如想要创建:
m = ~df['Student'].duplicated(keep='first')
# array([ True, True, True, False, True, False])
~m等于np.invert(m),它将True翻转为False,反之亦然。在这种情况下获得非重复的非常有用。如果我们现在将它作为选择器传递给数据帧:
df[m]
我们又来了:
Student Date
0 Joe December 2017
1 James January 2018
2 Bob April 2018
4 Jack February 2018
之前我打扰将Date列更改为datetime。在进行任何类型的日期排序或任何日期操作之前,这是很好的实践。
答案 1 :(得分:3)
如果您想知道重复项的数量及其用途:
df.pivot_table(index=['ColumnName'], aggfunc='size')
df.pivot_table(index=['ColumnName1',.., 'ColumnNameN'], aggfunc='size')
答案 2 :(得分:2)
您可以使用is_unique
:
pd.Series(df['Student']).is_unique
# equals true in case of no duplicates
答案 3 :(得分:0)
除了DataFrame.duplicated
和Series.duplicated
,熊猫还拥有DataFrame.any
和Series.any
。
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv")
检查重复项:
if df.duplicated().any():
some_duplicates = df[df.duplicated()].head()
print(f"Dataframe has one or more duplicated rows, for example:\n{some_duplicates}")
对于Python≥3.8,如果需要访问重复的行,请考虑使用assignment expression以避免重新计算重复的行:
if (duplicated := df.duplicated()).any():
some_duplicates = df[duplicated].head()
print(f"Dataframe has one or more duplicated rows, for example:\n{some_duplicates}")