web-dev-qa-db-ja.com

データフレーム列の重複値を確認します

行を削除せずにデータフレーム列に重複値があるかどうかを確認する方法はありますか?重複した行を削除する関数がありますが、特定の列に実際に重複がある場合にのみ実行するようにします。

現在、列の一意の値の数を行の数と比較します。一意の値が行よりも少ない場合、重複があり、コードが実行されます。

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

パンダを使用して、特定の列に重複した値が存在するかどうかを確認する簡単または効率的な方法はありますか?

作業中のサンプルデータの一部(2列のみ表示)。重複が見つかった場合、別の関数が保持する行(最も古い日付の行)を識別します。

    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
11
Jeff Mitchell

完全な例を次に示します。

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

非常に頻繁にpandasブールマスク、つまりフレームのサブセットを選択するために使用できるTrueまたはFalseの配列を作成することに興味があると思います。この場合、たとえば作成したい:

m = ~df['Student'].duplicated(keep='first')
# array([ True,  True,  True, False,  True, False])

〜mは、np.invert(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に変更することに悩まされていました。これは、あらゆる種類の日付の並べ替えまたは日付操作を行う前の適切な実践です。

12
Anton vBR