Pandas入門:データ分析のための基本操作10選
Pandasは、Pythonでデータ分析を行う上で欠かせないライブラリです。データ操作やデータ分析を効率的かつ柔軟に行うための強力な機能を提供します。特に、表形式のデータを扱う際に威力を発揮し、CSVファイルなどの読み込み、データのクリーニング、加工、集計、可視化まで、データ分析のワークフロー全体をサポートします。
ここでは、Pandasをこれから学び始める方のために、データ分析における基本となる10の操作を、具体的なコード例とともに解説します。これらの操作を習得することで、Pandasを使ったデータ分析の第一歩を踏み出すことができるでしょう。
1. ライブラリのインポートとバージョン確認
Pandasを使用する前に、まずライブラリをインポートする必要があります。慣例として、`pd`というエイリアスが使用されます。また、利用しているPandasのバージョンを確認しておくことは、以降の学習やトラブルシューティングにおいて重要です。
コード例
“`python
import pandas as pd
print(pd.__version__)
“`
2. DataFrameとSeriesの作成
Pandasの主要なデータ構造は、DataFrameとSeriesです。DataFrameは、行と列を持つ二次元の表形式データであり、Excelのスプレッドシートのようなイメージです。Seriesは、一次元の配列のようなデータ構造で、DataFrameの各列に相当します。
DataFrameの作成(辞書から)
辞書型のデータを`pd.DataFrame()`に渡すことでDataFrameを作成できます。辞書のキーが列名、値が各列のデータとなります。
コード例
“`python
data = {‘col1’: [1, 2, 3], ‘col2’: [‘A’, ‘B’, ‘C’]}
df = pd.DataFrame(data)
print(df)
“`
Seriesの作成(リストから)
リスト型のデータを`pd.Series()`に渡すことでSeriesを作成できます。
コード例
“`python
s = pd.Series([10, 20, 30])
print(s)
“`
3. CSVファイルの読み込み
データ分析では、CSV(Comma Separated Values)ファイル形式で提供されるデータを取り扱うことが非常に多いです。Pandasは、`pd.read_csv()`関数を使って、簡単にCSVファイルをDataFrameとして読み込むことができます。
コード例
“`python
# sample.csvというファイルが存在すると仮定
df_csv = pd.read_csv(‘sample.csv’)
print(df_csv.head()) # 最初の5行を表示
“`
4. データの概要把握(head, tail, info, describe)
データ分析の初期段階では、データの全体像を把握することが重要です。`head()`で先頭部分、`tail()`で末尾部分、`info()`で各列のデータ型や欠損値の有無、`describe()`で数値データの統計情報(平均、標準偏差、最小値、最大値など)を確認できます。
コード例
“`python
print(df.head()) # 先頭5行を表示
print(df.tail(3)) # 末尾3行を表示
print(df.info()) # データ型、非NULL値の数などを表示
print(df.describe()) # 数値列の統計量を表示
“`
5. 列の選択とフィルタリング
DataFrameから特定の列を選択したり、条件に基づいて行をフィルタリングしたりすることは、データ分析の基本中の基本です。
列の選択
列名を指定して、その列のSeriesを取得します。複数の列を選択する場合は、列名のリストを渡します。
コード例
“`python
# ‘col1’列を選択
col1_series = df[‘col1’]
print(col1_series)
# ‘col1’と’col2’列を選択
selected_cols = df[[‘col1’, ‘col2’]]
print(selected_cols)
“`
行のフィルタリング(条件指定)
ブールインデックス(True/Falseの配列)を用いて、条件に合致する行のみを抽出します。
コード例
“`python
# ‘col1’が2より大きい行を抽出
filtered_df = df[df[‘col1’] > 2]
print(filtered_df)
“`
6. 欠損値の処理(isnull, fillna, dropna)
実際のデータには、欠損値(NaN: Not a Number)が含まれていることがよくあります。欠損値は、計算結果に影響を与えたり、分析を妨げたりするため、適切に処理する必要があります。
欠損値の確認
`isnull()`メソッドは、DataFrameの各要素が欠損値かどうかを判定し、ブール値のDataFrameを返します。
コード例
“`python
print(df.isnull())
print(df.isnull().sum()) # 列ごとの欠損値の合計数を表示
“`
欠損値の補完
`fillna()`メソッドを使って、欠損値を特定の値(例えば0や平均値)で補完します。
コード例
“`python
# 欠損値を0で補完
df_filled_zero = df.fillna(0)
print(df_filled_zero)
# 平均値で補完(数値列のみ)
df_filled_mean = df.fillna(df.mean(numeric_only=True))
print(df_filled_mean)
“`
欠損値のある行・列の削除
`dropna()`メソッドを使って、欠損値を含む行または列を削除します。
コード例
“`python
# 欠損値を含む行を削除
df_dropped_rows = df.dropna()
print(df_dropped_rows)
# 欠損値を含む列を削除
df_dropped_cols = df.dropna(axis=1)
print(df_dropped_cols)
“`
7. 新しい列の追加と既存の列の操作
DataFrameに新しい列を追加したり、既存の列の値を加工したりすることは、データ分析において頻繁に行われます。
新しい列の追加
新しい列名に値を代入することで、新しい列を追加できます。
コード例
“`python
df[‘new_col’] = [100, 200, 300]
print(df)
# 既存の列の計算結果を新しい列として追加
df[‘col1_plus_10’] = df[‘col1’] + 10
print(df)
“`
既存の列の操作
四則演算や文字列操作など、様々な関数を適用して列の値を加工できます。
コード例
“`python
df[‘col2_lower’] = df[‘col2’].str.lower() # 文字列を小文字に変換
print(df)
“`
8. データの集計(groupby, agg, pivot_table)
特定のカテゴリごとにデータを集計することは、データ分析で頻繁に行われる操作です。`groupby()`メソッドは、指定した列のユニークな値ごとにデータをグループ化し、そのグループに対して集計操作(平均、合計、カウントなど)を適用します。
groupbyとagg
`groupby()`でグループ化し、`agg()`で複数の集計関数を一度に適用できます。
コード例
“`python
# 例として、’category’列と’value’列を持つDataFrameを仮定
data_agg = {‘category’: [‘A’, ‘B’, ‘A’, ‘B’, ‘A’], ‘value’: [10, 20, 15, 25, 12]}
df_agg = pd.DataFrame(data_agg)
# categoryごとにvalueの平均と合計を計算
grouped_data = df_agg.groupby(‘category’).agg({‘value’: [‘mean’, ‘sum’, ‘count’]})
print(grouped_data)
“`
pivot_table
`pivot_table()`は、より柔軟なクロス集計表を作成するのに役立ちます。行、列、値、集計関数を指定できます。
コード例
“`python
# 例として、’category’、’subcategory’、’value’列を持つDataFrameを仮定
data_pivot = {‘category’: [‘A’, ‘A’, ‘B’, ‘B’, ‘A’],
‘subcategory’: [‘X’, ‘Y’, ‘X’, ‘Y’, ‘Y’],
‘value’: [10, 15, 20, 25, 12]}
df_pivot = pd.DataFrame(data_pivot)
# categoryを行、subcategoryを列、valueの平均を値とするクロス集計表を作成
pivot = pd.pivot_table(df_pivot, values=’value’, index=’category’, columns=’subcategory’, aggfunc=’mean’)
print(pivot)
“`
9. データの結合(merge, concat)
複数のDataFrameを結合する方法は、データ分析において非常に重要です。`merge()`はSQLのJOINのように、共通のキー列を基にDataFrameを結合します。`concat()`は、DataFrameを縦方向または横方向に結合します。
merge
`how`引数で、`inner`(共通部分のみ)、`left`(左のDataFrameを基準)、`right`(右のDataFrameを基準)、`outer`(すべて)を指定できます。
コード例
“`python
df_left = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’], ‘A’: [‘A0’, ‘A1’, ‘A2’]})
df_right = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K3’], ‘B’: [‘B0’, ‘B1’, ‘B3′]})
# 内部結合
merged_inner = pd.merge(df_left, df_right, on=’key’, how=’inner’)
print(merged_inner)
# 左外部結合
merged_left = pd.merge(df_left, df_right, on=’key’, how=’left’)
print(merged_left)
“`
concat
`axis`引数で、0(縦方向)または1(横方向)を指定します。
コード例
“`python
df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’], ‘B’: [‘B0’, ‘B1’]})
df2 = pd.DataFrame({‘A’: [‘A2’, ‘A3’], ‘B’: [‘B2’, ‘B3’]})
# 縦方向に結合
concatenated_rows = pd.concat([df1, df2], ignore_index=True) # ignore_index=Trueでインデックスを振り直す
print(concatenated_rows)
df3 = pd.DataFrame({‘C’: [‘C0’, ‘C1’], ‘D’: [‘D0’, ‘D1’]})
# 横方向に結合
concatenated_cols = pd.concat([df1, df3], axis=1)
print(concatenated_cols)
“`
10. データの保存(to_csv)
分析・加工したデータをファイルとして保存することは、結果の共有や後続の処理のために不可欠です。Pandasでは、`to_csv()`メソッドを使って、DataFrameをCSVファイルとして保存できます。
コード例
“`python
# 分析結果をresult.csvとして保存
df.to_csv(‘result.csv’, index=False) # index=FalseでDataFrameのインデックスをファイルに含めない
“`
まとめ
上記で紹介した10の基本操作は、Pandasを用いたデータ分析の出発点として非常に重要です。これらの操作を繰り返し実践することで、DataFrameやSeriesの扱い方に慣れ、より複雑なデータ分析タスクに取り組むための土台が築かれます。
Pandasには、これら以外にも豊富な機能が用意されています。例えば、日付/時刻データの扱いに特化した機能、時系列分析、カテゴリカルデータの効率的な処理、パフォーマンスチューニングのためのテクニックなどです。まずは基本をしっかりとマスターし、必要に応じて公式ドキュメントやチュートリアルなどを参照しながら、Pandasの持つ強力な機能をさらに探求していくことをお勧めします。データ分析の世界が、Pandasと共に、より広がり、深まっていくことでしょう。
