行を削除せずにデータフレーム列に重複値があるかどうかを確認する方法はありますか?重複した行を削除する関数がありますが、特定の列に実際に重複がある場合にのみ実行するようにします。
現在、列の一意の値の数を行の数と比較します。一意の値が行よりも少ない場合、重複があり、コードが実行されます。
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
完全な例を次に示します。
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に変更することに悩まされていました。これは、あらゆる種類の日付の並べ替えまたは日付操作を行う前の適切な実践です。