ゼファーネットのロゴ

Pandas DataFrame での重複値の処理

日付:

概要

データ アナリストとして、正確で信頼できる洞察を得るためにデータの整合性を確保することは私たちの責任です。 データ クレンジングはこのプロセスで重要な役割を果たしており、重複値はデータ アナリストが遭遇する最も一般的な問題の XNUMX つです。 値が重複すると、洞察が誤って伝えられる可能性があります。 したがって、重複値を処理する効率的な方法を用意することが重要です。 この記事では、重複値を特定して処理する方法と、重複を管理するためのベスト プラクティスについて説明します。

重複する値の特定

重複した値を処理する最初のステップは、重複した値を識別することです。 重複する値を特定することは、データ クリーニングの重要な手順です。 Pandas は、データフレーム内の重複値を識別するための複数の方法を提供します。 このセクションでは、 duplicated() 機能と value_counts() 重複した値を識別する関数。

ウシン Duplicate()

  duplicated() function は、DataFrame 内の重複行をチェックする Pandas ライブラリ関数です。 の出力 duplicated() function は入力 DataFrame と同じ長さのブール系列であり、各要素は対応する行が重複しているかどうかを示します。

の簡単な例を考えてみましょう。 duplicated() 関数:

import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) df_duplicates = df.duplicated()
print(df_duplicates)

出力:

0 False
1 False
2 False
3 False
4 False
5 True
dtype: bool

上の例では、生徒の名前とその合計スコアを含む DataFrame を作成しました。 私たちが発動した duplicated() DataFrame 上で、次のブール値系列を生成します。 False 固有の値を表現し、 True 重複した値を表します。

この例では、最初に出現した値が一意とみなされます。 ただし、最後の値が一意であると見なされ、重複値を識別するときにすべての列を考慮したくない場合はどうすればよいでしょうか。 ここで、変更できます duplicated() パラメータ値を変更することで機能を変更します。

パラメータ: サブセットと保持

  duplicated() 関数は、オプションのパラメーターを通じてカスタマイズ オプションを提供します。 以下に説明するように、XNUMX つのパラメーターがあります。

  • subset: このパラメータを使用すると、重複検出時に考慮する列のサブセットを指定できます。 サブセットは次のように設定されています None デフォルトでは、DataFrame 内の各列が考慮されることを意味します。 列名を指定するには、サブセットに列名のリストを提供します。

    サブセット パラメーターの使用例を次に示します。

    
    df_duplicates = df.duplicated(subset=['StudentName'])
    

    出力:

    0 False
    1 False
    2 False
    3 False
    4 False
    5 True
    dtype: bool
    
  • keep: このオプションを使用すると、重複行のどのインスタンスを重複としてマークするかを選択できます。 keep に指定できる値は次のとおりです。

    • "first": これは、 keep オプション。 最初の値が一意であるとみなして、最初の出現を除くすべての重複を識別します。
    • "last": このオプションは、最後の出現を一意の値として識別します。 他のすべての出現は重複とみなされます。
    • False: このオプションは、各インスタンスに重複値のラベルを付けます。

これは、を使用する例です。 keep パラメータ を使用します。


df_duplicates = df.duplicated(keep='last')
print(df_duplicates)

出力:

0 True
1 False
2 False
3 False
4 False
5 False
dtype: bool
重複する値を視覚化する

  value_counts() 関数は、重複を識別するための XNUMX 番目のアプローチです。 の value_counts() 関数は、列内に各一意の値が出現する回数をカウントします。 を適用することで、 value_counts() 特定の列に関数を適用すると、各値の頻度を視覚化できます。

これは、を使用する例です。 value_counts() 関数:

import matplotlib.pyplot as plt
import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) name_counts = df['StudentName'].value_counts()
print(name_counts)

出力:

Mark 2
Ali 1
Bob 1
John 1
Johny 1
Name: StudentName, dtype: int64

次に、重複した値を棒グラフで視覚化してみましょう。 棒グラフを使用すると、重複する値の頻度を効果的に視覚化できます。


name_counts.plot(kind='bar')
plt.xlabel('Student Name')
plt.ylabel('Frequency')
plt.title('Duplicate Name Frequencies')
plt.show()

重複する値

重複値の処理

重複する値を特定したら、それらに対処します。 このセクションでは、パンダを使用して重複した値を削除および更新するためのさまざまな戦略を検討します。 drop_duplicates() & replace() 機能。 さらに、重複した値を含むデータの集計についても説明します。 groupby() 機能。

重複する値の削除

重複を処理する最も一般的な方法は、重複を DataFrame から削除することです。 DataFrame から重複レコードを削除するには、 drop_duplicates() 関数。 デフォルトでは、この関数は各重複行の最初のインスタンスを保持し、後続の行を削除します。 すべての列値に基づいて重複値を識別します。 ただし、サブセット パラメーターを使用して、考慮する列を指定できます。

の構文 drop_duplicates() パラメータのデフォルト値は次のとおりです。

dataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

  subset & keep パラメータの説明は次のとおりです。 duplicates()。 XNUMX 番目のパラメータを設定すると inplace 〜へ True、すべての変更は元の DataFrame に対して直接実行され、メソッドが返されます。 None 元の DataFrame が変更されます。 デフォルトでは、 inplace is False.

ここに例があります drop_duplicates() 関数:


df.drop_duplicates(keep='last', inplace=True)
print(df)

出力:

 StudentName Score
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

上の例では、最初のエントリは重複していたため削除されました。

重複する値を置換または更新する

重複を処理する XNUMX 番目の方法では、Pandas を使用して値を置き換えます。 replace() 関数。 ザ replace() 関数を使用すると、DataFrame 内の特定の値またはパターンを新しい値に置き換えることができます。 デフォルトでは、値のすべてのインスタンスが置き換えられます。 ただし、limit パラメーターを使用すると、置換の数を制限できます。

を使用した例を次に示します。 replace() 関数:


df['StudentName'].replace('Mark', 'Max', limit=1, inplace=True)
print(df)

出力:

 StudentName Score
0 Max 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

ここでは、最初の値を置き換えるために制限が使用されています。 最後に出現したものを置き換えたい場合はどうすればよいでしょうか? この場合、以下を組み合わせます。 duplicated() & replace() 機能。 使用する duplicated()、各重複値の最後のインスタンスを示し、次のコマンドを使用して行番号を取得します。 loc 関数を使用して置き換えます。 replace() 関数。 使用例は次のとおりです duplicated() & replace() 一緒に機能します。


last_occurrences = df.duplicated(subset='StudentName', keep='first') last_occurrences_rows = df[last_occurrences] df.loc[last_occurrences, 'StudentName'] = df.loc[last_occurrences, 'StudentName'].replace('Mark', 'Max') print(df)

出力:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Max 45

複雑な置換のためのカスタム関数

場合によっては、重複した値を処理するには、単に削除または更新するよりも複雑な置換が必要になります。 カスタム関数を使用すると、ニーズに合わせた特定の置換ルールを作成できます。 パンダを使って apply() 関数を使用すると、カスタム関数をデータに適用できます。

たとえば、「StudentName」列に重複した名前が含まれているとします。 私たちの目標は、重複値の末尾に数字を追加して重複値を一意にするカスタム関数を使用して重複値を置換することです。


def add_number(name, counts): if name in counts: counts[name] += 1 return f'{name}_{counts[name]}' else: counts[name] = 0 return name name_counts = {} df['is_duplicate'] = df.duplicated('StudentName', keep=False)
df['StudentName'] = df.apply(lambda x: add_number(x['StudentName'], name_counts) if x['is_duplicate'] else x['StudentName'], axis=1)
df.drop('is_duplicate', axis=1, inplace=True)
print(df)

出力:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark_1 45

重複する値を含むデータを集計する

重複する値を含むデータを集約して要約し、データから洞察を得ることができます。 パンダ groupby() 関数を使用すると、重複した値を持つデータを集計できます。 を使用することで、 groupby() 関数を使用すると、XNUMX つ以上の列をグループ化し、グループごとに別の列の平均、中央値、または合計を計算できます。

を使用した例を次に示します。 groupby() 方法:


grouped = df.groupby(['StudentName']) df_aggregated = grouped.sum()
print(df_aggregated)

出力:

 Score
StudentName Ali 65
Bob 76
John 44
Johny 39
Mark 90

高度なテクニック

より複雑なシナリオを処理し、正確な分析を保証するために、使用できる高度なテクニックがいくつかあります。 このセクションでは、あいまい重複、時系列データの重複、およびインデックス値の重複の処理について説明します。

ファジィ重複

あいまい重複は、完全一致ではないが類似しているレコードであり、データの入力ミス、スペルミス、書式の違いなど、さまざまな理由で発生する可能性があります。 を使用します。 fuzzywuzzy 文字列の類似性マッチングを使用して重複を識別する Python ライブラリ。

ファジー値を処理する例を次に示します。

import pandas as pd
from fuzzywuzzy import fuzz def find_fuzzy_duplicates(dataframe, column, threshold): duplicates = [] for i in range(len(dataframe)): for j in range(i+1, len(dataframe)): similarity = fuzz.ratio(dataframe[column][i], dataframe[column][j]) if similarity >= threshold: duplicates.append(dataframe.iloc[[i, j]]) if duplicates: duplicates_df = pd.concat(duplicates) return duplicates_df else: return pd.DataFrame() data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) threshold = 70 fuzzy_duplicates = find_fuzzy_duplicates(df, 'StudentName', threshold)
print("Fuzzy duplicates:")
print(fuzzy_duplicates.to_string(index=False))

この例では、カスタム関数を作成します find_fuzzy_duplicates これは、DataFrame、列名、および類似性のしきい値を入力として受け取ります。 この関数は、DataFrame 内の各行を反復処理し、次の行を使用してそれを後続の行と比較します。 fuzz.ratio からのメソッド fuzzywuzzy 図書館。 類似性スコアがしきい値以上の場合、重複する行がリストに追加されます。 最後に、この関数はあいまい重複を含む DataFrame を返します。

出力:

Fuzzy duplicates:
StudentName Score Mark 45 Mark 45 John 44 Johny 39

上の例では、あいまいな重複が「StudentName」列で識別されます。 「find_fuzzy_duplicates」関数は、次のメソッドを使用して文字列の各ペアを比較します。 fuzzywuzzy 図書館の fuzz.ratio レーベンシュタイン距離に基づいて類似性スコアを計算する関数。 しきい値を 70 に設定しました。これは、一致率が 70 を超える名前はあいまい値とみなされます。 あいまいな値を特定したら、「重複の処理」セクションで概説した方法を使用してそれらを管理できます。

時系列データの重複の処理

複数の観測値が同じタイムスタンプで記録される場合、重複が発生する可能性があります。 これらの値を適切に処理しないと、偏った結果が生じる可能性があります。 時系列データ内の重複値を処理する方法をいくつか紹介します。

  • 完全な重複の削除: このメソッドでは、 drop_duplicates パンダの関数。
  • 異なる値を持つ重複したタイムスタンプ: タイムスタンプは同じだが値が異なる場合、次を使用してデータを集計し、より多くの洞察を得ることができます。 groupby()または、最新の値を選択し、次を使用して他の値を削除することもできます。 drop_duplicates() keep パラメータが「last」に設定されました。

重複するインデックス値の処理

重複したインデックス値に対処する前に、まず Pandas におけるインデックスとは何かを定義しましょう。 インデックスは、DataFrame の各行に割り当てられる一意の識別子です。 Pandas は、デフォルトで XNUMX から始まる数値インデックスを割り当てます。 ただし、インデックスは任意の列または列の組み合わせに割り当てることができます。 Index 列内の重複を特定するには、 duplicated() & drop_duplicates() それぞれ機能します。 このセクションでは、インデックス列の重複を処理する方法を説明します。 reset_index().

その名前が示すように、 reset_index() Pandas の関数は、DataFrame のインデックスをリセットするために使用されます。 適用するときは、 reset_index() 関数を使用すると、現在のインデックスは自動的に破棄されます。これは、初期のインデックス値が失われることを意味します。 を指定することで、 drop パラメータとして False セクションに reset_index() 関数を使用すると、インデックスをリセットするときに元のインデックス値を保持できます。

使用例はこちら reset_index():

import pandas as pd data = { 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data, index=['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark']) df.reset_index(inplace=True)
print(df)

出力:

 index Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

ベストプラクティス

  • 重複データの性質を理解する: アクションを実行する前に、重複する値が存在する理由と、それが何を表すかを理解することが重要です。 根本原因を特定し、それに対処するための適切な手順を決定します。

  • 重複を処理するための適切な方法を選択する: 前のセクションで説明したように、重複を処理するには複数の方法があります。 選択する方法は、データの性質と実行する目的の分析によって異なります。

  • アプローチを文書化する: 重複値を検出して対処するプロセスを文書化し、他の人が思考プロセスを理解できるようにすることが重要です。

  • 注意を行使する: データを削除または変更するときは常に、重複を排除することで分析にエラーやバイアスが生じないようにする必要があります。 健全性テストを実施し、各アクションの結果を検証します。

  • 元のデータを保存する: データに対して操作を実行する前に、元のデータのバックアップ コピーを作成してください。

  • 今後の重複を防ぐ:今後重複が発生しないように対策を講じます。 これには、データ入力時のデータ検証、データ クレンジング ルーチン、または一意性を強制するためのデータベース制約が含まれる場合があります。

最終的な考え

データ分析では、重複値に対処することが重要なステップです。 値が重複すると、不正確な結果が生じる可能性があります。 重複する値を効率的に特定して管理することにより、データ アナリストは正確で重要な情報を導き出すことができます。 前述の手法を実装し、ベスト プラクティスに従うことで、アナリストはデータの整合性を維持し、そこから貴重な洞察を抽出できるようになります。

スポット画像

最新のインテリジェンス

スポット画像