检查dataframe列

时间:2018-05-08 22:11:28

标签: python python-3.x 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

4 个答案:

答案 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.duplicatedSeries.duplicated,熊猫还拥有DataFrame.anySeries.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}")