はじめに
Pandas を用いた基本的なデータクリーニングの実験へようこそ。データクリーニングは、あらゆるデータ分析や機械学習プロジェクトにおいて、非常に重要な最初のステップです。現実世界のデータはしばしば不完全で、欠損値、重複エントリ、または不正確なデータ型を含んでいます。生の、クリーンでないデータを使用すると、不正確な分析や信頼性の低い結論につながる可能性があります。
Pandas は、高性能で使いやすいデータ構造とデータ分析ツールを提供する強力な Python ライブラリです。Python におけるデータクリーニングと操作のための定番ツールです。
この実験では、Pandas を使用してデータセットをクリーニングするための基本的なテクニックを学びます。以下の操作を実践します。
dropna()を使用した欠損値を含む行の削除。fillna()を使用した欠損値の補完。drop_duplicates()を使用した重複行の削除。rename()を使用した列名の変更。astype()を使用した列のデータ型の変換。
この実験の終わりには、Pandas における基本的なデータクリーニングワークフローについて、確かな理解が得られるでしょう。
dropna メソッドで欠損値のある行を削除
このステップでは、null 値を含む行を削除して欠損データを処理する方法を学びます。Pandas では、欠損データは NaN (Not a Number) で表されます。NaN 値を処理するための最も簡単な戦略の 1 つは、それらを含む行または列を削除することです。
dropna() メソッドを使用すると、これを簡単に行うことができます。デフォルトでは、少なくとも 1 つの NaN 値を含むすべての行を削除します。
まず、初期スクリプトを実行して、開始時の DataFrame を確認しましょう。セットアップ スクリプトは、~/project ディレクトリに main.py という名前のファイルを既に作成しています。
WebIDE でターミナルを開き、次のコマンドを実行します。
python3 main.py
age 列と city 列に NaN 値が含まれている元の DataFrame が表示されるはずです。
Original DataFrame:
name age city SALARY_IN_USD
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
4 Alice 25.0 New York 50000
5 Eva NaN Boston 90000
6 Frank 45.0 NaN 100000
Original DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
## Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 7 non-null object
1 age 6 non-null float64
2 city 6 non-null object
3 SALARY_IN_USD 7 non-null object
dtypes: float64(1), object(3)
memory usage: 352.0+ bytes
次に、dropna() を使用してその動作を確認しましょう。左側のパネルのファイルエクスプローラーから main.py ファイルを開きます。ファイルに次のコードを追加します。このコードは、NaN 行が削除された新しい DataFrame df_dropped を作成し、それを表示します。元の df はまだ変更していないため、次のステップで他のメソッドを探索できます。
## Add this to the end of main.py
print("\nDataFrame after dropping rows with any missing values:")
df_dropped = df.dropna()
print(df_dropped)
ファイルを保存 (Ctrl+S または Cmd+S) し、ターミナルから再度実行します。
python3 main.py
出力には、NaN 値を含む行 (Eva と Frank の行) が削除された後の DataFrame を示す新しいセクションが含まれるようになります。
## ... (previous output) ...
DataFrame after dropping rows with any missing values:
name age city SALARY_IN_USD
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
4 Alice 25.0 New York 50000
fillna を使用して欠損値を補完
このステップでは、欠損データを処理する別の方法、つまり fillna() メソッドを使用して欠損値を特定の値で埋める方法を学びます。欠損データを含む行を削除すると、特に多くの行に欠損値がある場合、大幅なデータ損失につながることがあります。それらを埋めることは、しばしばより良い代替手段となります。
NaN 値は、0 や "Unknown" のような定数、または列の平均や中央値のような計算された値で埋めることができます。
main.py ファイルを変更しましょう。前のステップで追加した dropna() を表示するだけでなく、欠損値を埋めることでメインの DataFrame df をクリーニングします。欠損している age は既存の年齢の平均で、欠損している city は文字列 'Unknown' で埋めます。
前のステップで追加した dropna() コードを削除し、次のコードに置き換えます。inplace=True を使用して DataFrame を直接変更します。
## Replace the dropna() code with this at the end of main.py
## Calculate the mean of the 'age' column
mean_age = df['age'].mean()
## Fill missing values using the recommended approach to avoid FutureWarnings
df.fillna({'age': mean_age, 'city': 'Unknown'}, inplace=True)
print("\nDataFrame after filling missing values:")
print(df)
inplace=True 引数は DataFrame をインプレースで変更します。つまり、結果を変数に再代入する必要はありません (例:df = df.fillna(...))。
ファイルを保存し、ターミナルから実行します。
python3 main.py
NaN 値が置き換えられていることがわかります。Eva の年齢は平均年齢になり、Frank の都市は 'Unknown' になります。
## ... (original DataFrame output) ...
DataFrame after filling missing values:
name age city SALARY_IN_USD
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
4 Alice 25.0 New York 50000
5 Eva 33.3 Boston 90000
6 Frank 45.0 Unknown 100000
注:平均年齢は (25+30+35+40+25+45)/6 = 33.33... です。Pandas はこの値で NaN を埋めます。上記の出力は簡略化のために 35.0 を示していますが、Eva の年齢の実際の出力は計算された平均になります。
drop_duplicates で重複行を削除
このステップでは、DataFrame から重複行を削除する方法を学びます。重複データは分析を歪め、誤った結果につながる可能性があります。drop_duplicates() メソッドは、それらを特定して削除するのに役立ちます。
元のデータセットでは、「Alice」の行がまったく同じ情報で 2 回出現しています。欠損値の処理が完了したので、次のクリーニング タスクは、この重複エントリを削除することです。
デフォルトでは、drop_duplicates() は、すべての列の値が別の行の値と同一である場合に、その行を重複と見なします。
次のコードを main.py スクリプトの末尾に追加します。DataFrame を変更するために、引き続き inplace=True を使用します。
## Add this to the end of main.py
df.drop_duplicates(inplace=True)
print("\nDataFrame after dropping duplicates:")
print(df)
ファイルを保存し、ターミナルから実行します。
python3 main.py
出力には、'Alice' の行の 1 つが削除されたため、6 行のみの DataFrame が表示されるようになります。
## ... (previous output) ...
DataFrame after dropping duplicates:
name age city SALARY_IN_USD
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
5 Eva 33.3 Boston 90000
6 Frank 45.0 Unknown 100000
インデックス 4 が失われていることに注意してください。これは削除された重複行に対応します。DataFrame には現在 6 つの一意の行があります。
rename メソッドを使用した列名の変更
このステップでは、列名を変更する方法を学びます。一貫性があり明確な列名は、コードの可読性と保守性にとって不可欠です。すべて小文字でアンダースコアを使用するなど、一貫した命名規則を使用することは一般的なプラクティスです。
DataFrame には SALARY_IN_USD という名前の列があります。これをよりシンプルで小文字の名前である salary に変更しましょう。rename() メソッドはこれに最適です。columns 引数に辞書を渡します。この辞書では、キーが古い名前、値が新しい名前になります。
次のコードを main.py スクリプトの末尾に追加します。
## Add this to the end of main.py
df.rename(columns={'SALARY_IN_USD': 'salary'}, inplace=True)
print("\nDataFrame after renaming columns:")
print(df)
ファイルを保存し、ターミナルから実行します。
python3 main.py
SALARY_IN_USD 列が salary に正常に変更されたことがわかります。
## ... (previous output) ...
DataFrame after renaming columns:
name age city salary
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
5 Eva 33.3 Boston 90000
6 Frank 45.0 Unknown 100000
この簡単な変更により、列名をタイプしやすくなり、一般的な Python スタイル ガイドに従うことができます。
astype を使用した列の型変換
この最終ステップでは、列のデータ型を変換する方法を学びます。正しいデータ型は、計算の実行とメモリ効率にとって非常に重要です。
最初の df.info() の出力を見ると、SALARY_IN_USD 列の Dtype が object であったことに気づくでしょう。これは、数値を文字列として格納していたことを意味します。文字列に対して数学的な操作(平均給与の計算など)を実行することはできません。この列を int(整数)などの数値型に変換する必要があります。
この目的のために astype() メソッドが使用されます。新しい salary 列を int 型に変換しましょう。
次のコードを main.py の末尾に追加します。変更を確認するために、DataFrame の情報も再度表示します。
## Add this to the end of main.py
df['salary'] = df['salary'].astype(int)
print("\nDataFrame after converting data types:")
print(df)
print("\nFinal DataFrame Info:")
df.info()
ファイルを保存し、最後にもう一度実行します。
python3 main.py
最終的な出力には、クリーニングされた DataFrame とその新しい情報が表示されます。情報出力の salary 列の Dtype をよく見てください。object ではなく int64 になっているはずです。
## ... (previous output) ...
DataFrame after converting data types:
name age city salary
0 Alice 25.0 New York 50000
1 Bob 30.0 Los Angeles 60000
2 Charlie 35.0 New York 70000
3 David 40.0 Chicago 80000
5 Eva 33.3 Boston 90000
6 Frank 45.0 Unknown 100000
Final DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 0 to 6
Data columns (total 4 columns):
## Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 6 non-null object
1 age 6 non-null float64
2 city 6 non-null object
3 salary 6 non-null int64
dtypes: float64(1), int64(1), object(2)
memory usage: 240.0+ bytes
salary 列が整数型になったので、df['salary'].mean() のような計算を実行できるようになりました。
まとめ
Pandas の基本的なデータクリーニング実験を完了しました。これで、乱雑で生のデータセットを、分析に適したクリーンな形式に正常に変換できました。
この実験では、Pandas のいくつかの重要なデータクリーニング技術を学び、実践しました。
- 欠損値の処理:
dropna()を使用してNaNを含む行を削除する方法と、fillna()を使用して意味のあるデータでそれらを埋める方法を学びました。 - 重複の削除:
drop_duplicates()を使用して、データセットから冗長な行を削除しました。 - 列名の変更:
rename()メソッドを使用して、列名をより一貫性があり読みやすくする方法を学びました。 - データ型の変換:
astype()を使用して、列のデータ型を正しい形式に変更し、さらなる分析を可能にしました。
これらの基本的なスキルは、あらゆる真剣なデータ作業の基盤となります。これらを習得することで、現実世界のデータの課題に自信を持って取り組むことができるようになります。これらの技術を練習し続けることで、Pandas を使用したデータ操作に習熟してください。



