ウェブサイト検索

データクリーニングに役立つ 10 の Python ワンライナー


ここでは、一般的なデータ クリーニング タスクに役立つ Python のワンライナーをいくつか紹介します。

データセットを操作するときは、さらに分析できるデータを得るためにデータセットをクリーンアップする必要があります。一般的なデータ品質の問題には、重複、不正な形式、範囲外の値、エントリの欠落などがあります。

このチュートリアルでは、一般的なデータ クリーニング タスクに使用できる Python ワンライナーについて説明します。サンプル データセットを使用して作業します。

快適に作業を進めるには、Python のリストと辞書の内包理解に慣れている必要があります。始めましょう。

サンプルデータの生成

▶️ このチュートリアルの Google Colab ノートブックは次のとおりです。

まずサンプル データを生成します。

data = [
	{"name": "alice smith", "age": 30, "email": "alice@example.com", "salary": 50000.00, "join_date": "2022-03-15"},
	{"name": "bob gray", "age": 17, "email": "bob@not-an-email", "salary": 60000.00, "join_date": "invalid-date"},
	{"name": "charlie brown", "age": None, "email": "charlie@example.com", "salary": -1500.00, "join_date": "15-09-2022"},
	{"name": "dave davis", "age": 45, "email": "dave@example.com", "salary": 70000.00, "join_date": "2021-07-01"},
	{"name": "eve green", "age": 25, "email": "eve@example.com", "salary": None, "join_date": "2023-12-31"},
]

次に、作業しているサンプル データの問題を修正するコードを書いてみましょう。

1. 文字列を大文字にする

データセット全体で文字列形式の一貫性を維持することが重要です。次に示すように、名前の文字列を大文字にしましょう。

# Capitalizing the names for consistency
data = [{**d, "name": d["name"].title()} for d in data]

2. データ型の変換

正確な分析には、データセット全体でデータ型が一貫していて正しいことを確認することが必要です。サンプル データで、該当する場合は年齢を整数に変換してみましょう。

# Converting age to an integer type, defaulting to 25 if conversion fails
data = [{**d, "age": int(d["age"]) if isinstance(d["age"], (int, float)) else 25} for d in data]

3. 数値範囲の検証

数値が許容範囲内にあることを確認することも重要です。年齢が 18 から 60 の範囲内であることを確認し、そうでない場合はデフォルト値を割り当てます。

# Ensuring age is an integer within the range of 18 to 60; otherwise, set to 25
data = [{**d, "age": d["age"] if isinstance(d["age"], int) and 18 <= d["age"] <= 60 else 25} for d in data]

4.電子メールの検証

テキストフィールドを操作する場合、書式の不一致は非常に一般的です。次のコード行は、電子メール アドレスが有効であることを確認し、無効なアドレスをデフォルトのアドレスに置き換えます。

# Verifying that the email contains both an "@" and a "."; 
#assigning 'invalid@example.com' if the format is incorrect
data = [{**d, "email": d["email"] if "@" in d["email"] and "." in d["email"] else "invalid@example.com"} for d in data]

5. 欠損値の処理

欠損値は、ほとんどのデータセットでよく見られるもう 1 つの問題です。ここでは、欠落している給与値をチェックし、次のようにデフォルト値に置き換えます。

# Assigning a default salary of 30,000 if the salary is missing
data = [{**d, "salary": d["salary"] if d["salary"] is not None else 30000.00} for d in data]

6. 日付形式の標準化

日付と時刻については、すべて同じ形式にすることが重要です。さまざまな日付形式を 1 つの形式 (無効なエントリのプレースホルダーをデフォルトとして) に変換する方法は次のとおりです。

from datetime import datetime

# Attempting to convert the date to a standardized format and defaulting to '2023-01-01' if invalid
data = [{**d, "join_date": (lambda x: (datetime.strptime(x, '%Y-%m-%d').date() if '-' in x and len(x) == 10 else datetime.strptime(x, '%d-%m-%Y').date()) if x and 'invalid-date' not in x else '2023-01-01')(d['join_date'])} for d in data]

これは機能しますが、それでも読みにくい場合があります。代わりに、これを複数のステップに分割した方がよい場合があります。読みやすさと保守性を犠牲にして内包表記を使用すべきではない理由については、「Python でリスト内包表記を使いすぎてはいけない理由」を読んでください。

7. 負の値を削除する

場合によっては、年齢、給与など、特定の数値フィールドが負でない値のみを受け取るようにする必要がある場合があります。たとえば、次のように、負の給与値をゼロに置き換えることができます。

# Replacing negative salary values with zero to ensure all values are non-negative
data = [{**d, "salary": max(d["salary"], 0)} for d in data]

8. 重複のチェック

データセットをさらに分析する前に、重複レコードを削除することが重要です。重複する名前をチェックして、一意のレコードのみが残るようにしましょう。

# Keeping only unique entries based on the name field
data = {tuple(d.items()) for d in data}  # Using a set to remove duplicates
data = [dict(t) for t in data]  # Converting back to list of dictionaries

9. スケール数値

数値のスケーリングは、一貫した分析に役立つ場合があります。内包表記を使用して、給与をデータセット内の最大給与の割合にスケールしてみましょう。

# Normalizing salary values to a percentage of the maximum salary
max_salary = max(d["salary"] for d in data)
data = [{**d, "salary": (d["salary"] / max_salary * 100) if max_salary > 0 else 0} for d in data]

10. 空白をトリミングする

場合によっては、文字列から不要な空白を削除する必要があるかもしれません。以下は、名前文字列から先頭と末尾のスペースを削除するワンライナーです。

# Trimming whitespace from names for cleaner data
data = [{**d, "name": d["name"].strip()} for d in data]

データ クリーニング手順を実行すると、データ ディクショナリは次のようになります。

[{'name': 'Bob Gray',
  'age': 25,
  'email': 'invalid@example.com',
  'salary': 85.71428571428571,
  'join_date': '2023-01-01'},
 {'name': 'Alice Smith',
  'age': 30,
  'email': 'alice@example.com',
  'salary': 71.42857142857143,
  'join_date': datetime.date(2022, 3, 15)},
 {'name': 'Charlie Brown',
  'age': 25,
  'email': 'charlie@example.com',
  'salary': 0.0,
  'join_date': datetime.date(2022, 9, 21)},
 {'name': 'Dave Davis',
  'age': 45,
  'email': 'dave@example.com',
  'salary': 100.0,
  'join_date': datetime.date(2021, 7, 1)},
 {'name': 'Eve Green',
  'age': 25,
  'email': 'eve@example.com',
  'salary': 42.857142857142854,
  'join_date': datetime.date(2023, 12, 31)}]

結論

このチュートリアルでは、一般的なデータ品質の問題と、サンプル データセットをクリーンアップするための Python のワンライナーについて説明しました。

これらは、簡単なクリーニングを行ってデータの分析にすぐに取り掛かる必要がある場合に便利です。パンダに関する同様の記事を探している場合は、「データ アクセス、操作、管理に関する 10 のパンダのワン ライナー」をお読みください。

データのクリーニングを楽しんでください。

関連記事