データ解析や機械学習を行う上で、Pythonは非常に強力なツールです。
その中でも、Pandasはデータ操作や分析を効率的に行うためのライブラリとして広く利用されています。
Pythonを勉強し始めてif文やfor文といった基礎の基礎を終えたら、次に覚えるべきはPandas (とNumpy)が第一候補に挙がってもおかしくないくらい、Pythonの基本スキルであると言えます。
本記事では、Python初心者でも理解しやすいように、Pandasの基本的な使い方から実践的なテクニックまでを解説していきます。
Pandasとは?
そもそもPandasってなに?
PandasとはCSVやExcelといった構造化されたデータを、簡単かつ効率的に操作・分析するための機能を実装しているライブラリです。
データの読み込みや操作を簡単なコードで行う事ができ応用も効くため、一通りの操作はこの記事を通してマスターしてしまいましょう!
Pandasの特徴
Pandasの代表的な特徴は以下の通りです。
1. 多様なデータ型のサポート
PandasのDataFrameは、異なるデータ型を同じ表形式で扱うことができます。
これにより、数値、文字列、日時など様々な型のデータを一つのデータ構造内で管理できます。
例えば、チンチラの給餌データを日々Excelに記録しているとしましょう。
記録項目は「日時、量、餌の種類、チンチラの名前」といったところでしょうか。
この場合、各項目は下記のようにそれぞれ異なる列で管理する事になると思います。
日時 | 量[g] | 餌の種類 | チンチラの名前 |
---|---|---|---|
2024/08/21 10:00 | 20 | チモシーの極み | チラ子 |
2024/08/21 10:00 | 20 | チモシー一番刈り | グレオ |
: | : | : | : |
こうした複数の型をひとつのテーブルとしてまとめたデータも、まとめて扱う事ができます。
2. 豊富なデータ操作機能
Pandasはデータの読み込み、フィルタリング、集計、結合、欠損値処理などデータ分析に必要な機能を豊富に備えています。
また、データの可視化や統計処理など、専門的な分析にも対応できる機能が揃っています。
Pandasのインストール方法
さて、次はPandasを使う準備です!
PandasはPythonの標準ライブラリではないため、別途インストールが必要です。以下に主要なインストール方法を紹介します。
pipを使用したインストール
ターミナル(Mac)やコマンドプロンプト(Windows)で以下のコマンドを実行します。
pip install pandas
Jupyter Notebookでのインストール
Jupyter Notebook上で以下のコードを実行することでもインストールが可能です。
※Jupyter Notebookでは先頭に!マークをつける事でOSのコマンドを呼べます。
!pip install pandas
Pandasの基本データ構造
ではここで早速Pandasを使っていきましょう!
Pandasには主に2つの基本的なデータ構造があります。
- Series(シリーズ)
- DataFrame(データフレーム)
これらのデータ構造を理解することで、Pandasを効果的に活用できます。
Series(シリーズ)
Seriesは、一連のデータを一次元で表現するデータ構造です。各データにはインデックス(ラベル)が対応しており、リストや配列のように扱うことができます。
Seriesの作成例
import pandas as pd
# シリーズの作成
s = pd.Series([10, 20, 30, 40])
print(s)
出力:
0 10
1 20
2 30
3 40
dtype: int64
インデックスを指定したSeries
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
出力:
a 10
b 20
c 30
d 40
dtype: int64
DataFrame(データフレーム)
DataFrameは、行と列からなる二次元のデータ構造で、スプレッドシートやSQLテーブルに似ています。
各列は異なるデータ型を持つことができ、複雑なデータを効率的に管理・操作できます。
DataFrameの作成例
import pandas as pd
# データフレームの作成
data = {
'名前': ['田中', '山田', '佐藤'],
'年齢': [25, 30, 22],
'職業': ['エンジニア', 'デザイナー', 'ライター']
}
df = pd.DataFrame(data)
print(df)
出力:
名前 年齢 職業
0 田中 25 エンジニア
1 山田 30 デザイナー
2 佐藤 22 ライター
列順序の指定
df = pd.DataFrame(data, columns=['職業', '名前', '年齢'])
print(df)
出力:
職業 名前 年齢
0 エンジニア 田中 25
1 デザイナー 山田 30
2 ライター 佐藤 22
列名の変更
df.columns = ['Occupation', 'Name', 'Age']
print(df)
出力:
Occupation Name Age
0 エンジニア 田中 25
1 デザイナー 山田 30
2 ライター 佐藤 22
一次元のデータはSeries、二次元のデータはDataFrameといった感じなんだね!
データの確認方法
データを操作する前に、その内容を確認することは非常に重要です。
Pandasでは、簡単にデータの概要を把握するためのメソッドが用意されています。
head()とtail()
head()
: データフレームの先頭数行を表示します。デフォルトでは5行表示されますが、引数で行数を指定できます。tail()
: データフレームの末尾数行を表示します。こちらもデフォルトは5行です。
使用例
import pandas as pd
import numpy as np
# ランダムなデータを持つデータフレームを作成
df = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
# 先頭3行を表示
print(df.head(3))
# 末尾3行を表示
print(df.tail(3))
出力例:
A B C
0 0.564392 -1.234567 0.987654
1 -0.123456 0.654321 -0.876543
2 1.234567 -0.765432 0.543210
A B C
7 0.456789 -0.987654 1.234567
8 -1.234567 0.876543 -0.654321
9 0.765432 -0.543210 0.123456
データの選択と抽出
データ解析では、特定の行や列を抽出する操作が頻繁に行われます。Pandasでは、loc
とiloc
を使用して柔軟にデータを選択できます。
また、Pandasでは通常データフレームからデータ抽出を行う際に[](鉤括弧)を使います。
そのときの指定方法は[行, 列]の順となっていて、今回のlocやilocでもその順で指定するように注意してください。
locとilocの使い方
loc
: ラベル(行名や列名)を指定してデータを選択します。iloc
: インデックス(行番号や列番号)を指定してデータを選択します。
locの使用例
import pandas as pd
data = {
'名前': ['田中', '山田', '佐藤'],
'年齢': [25, 30, 22],
'職業': ['エンジニア', 'デザイナー', 'ライター']
}
df = pd.DataFrame(data)
df.set_index('名前', inplace=True)
# 特定の行と列を選択
print(df.loc['田中', '職業'])
# 複数の行と列を選択
print(df.loc[['田中', '佐藤'], ['年齢', '職業']])
出力:
エンジニア
年齢 職業
名前
田中 25 エンジニア
佐藤 22 ライター
ilocの使用例
# 0番目の行と1番目の列を選択
print(df.iloc[0, 1])
# スライスを使って選択
print(df.iloc[0:2, 0:2])
出力:
エンジニア
年齢 職業
名前
田中 25 エンジニア
山田 30 デザイナー
条件に基づくデータ抽出(query)
query
メソッドを使うと、特定の条件に一致するデータを簡潔に抽出できます。
queryの使用例
import pandas as pd
data = {
'名前': ['田中', '山田', '佐藤', '鈴木'],
'年齢': [25, 30, 22, 28],
'職業': ['エンジニア', 'デザイナー', 'ライター', 'エンジニア']
}
df = pd.DataFrame(data)
# 年齢が25以上のデータを抽出
result = df.query('年齢 >= 25')
print(result)
出力:
名前 年齢 職業
0 田中 25 エンジニア
1 山田 30 デザイナー
3 鈴木 28 エンジニア
複数の条件を組み合わせることも可能です。
# 年齢が25以上で職業がエンジニアのデータを抽出
result = df.query('年齢 >= 25 and 職業 == "エンジニア"')
print(result)
出力:
名前 年齢 職業
0 田中 25 エンジニア
3 鈴木 28 エンジニア
条件に基づくデータ抽出(queryを使わない方法)
query
メソッドを使わないでも、特定の条件に一致するデータを抽出することができます。
筆者はこの方法の方がコードが分かりやすくて好きだったりします。使いやすい方法を選択するのが良いでしょう。
データ抽出の例
import pandas as pd
data = {
'名前': ['田中', '山田', '佐藤', '鈴木'],
'年齢': [25, 30, 22, 28],
'職業': ['エンジニア', 'デザイナー', 'ライター', 'エンジニア']
}
df = pd.DataFrame(data)
# 年齢が25以上のデータを抽出
result = df[df['年齢'] >= 25]
print(result)
出力:
名前 年齢 職業
0 田中 25 エンジニア
1 山田 30 デザイナー
3 鈴木 28 エンジニア
ちなみに、df[df[‘年齢’] >= 25]で抽出ができる理由ですが、鉤括弧内のdf[‘年齢’] >= 25という部分が’年齢’列が25を超えるようなレコードにTrue、そうでないレコードにはFalseが付されたSeriesとなっていて、そのTrue/Falseに基づいて、Trueにあたる行のみdfから抽出するような操作が為されています。
データの入出力
Pandasでは様々な形式のデータファイルを簡単に読み書きすることができます。ここでは、最も一般的なCSVファイルの読み込みと書き出し方法を紹介します。
CSVファイルの読み込みと書き出し
CSVファイルの読み込み
import pandas as pd
# CSVファイルの読み込み
df = pd.read_csv('sample_data.csv')
print(df.head())
CSVファイルの書き出し
# CSVファイルへの書き出し
df.to_csv('output_data.csv', index=False)
オプションの指定
読み込み時には様々なオプションを指定することができます。
# 区切り文字やエンコーディングを指定
df = pd.read_csv('sample_data.csv', sep='\t', encoding='utf-8', skiprows=1)
その他にも、Excel、JSON、SQLデータベースなど、多様なデータ形式に対応しています。
Excelファイルの読み込みと書き出し
# Excelファイルの読み込み
df = pd.read_excel('sample_data.xlsx', sheet_name='Sheet1')
# Excelファイルへの書き出し
df.to_excel('output_data.xlsx', sheet_name='Result', index=False)
CSV,Excelからの読み込み→集計・分析→CSV,Excelにして結果を出力という操作は実務でよく使われる操作だね!
データの並び替え(ソート)
データを特定の順序で並び替えることで、分析がしやすくなります。Pandasでは、sort_values
とsort_index
メソッドを使用してデータをソートできます。
sort_valuesによる値でのソート
import pandas as pd
data = {
'名前': ['田中', '山田', '佐藤', '鈴木'],
'年齢': [25, 30, 22, 28],
'得点': [85, 90, 75, 95]
}
df = pd.DataFrame(data)
# 得点で昇順にソート
sorted_df = df.sort_values(by='得点')
print(sorted_df)
出力:
名前 年齢 得点
2 佐藤 22 75
0 田中 25 85
1 山田 30 90
3 鈴木 28 95
sort_indexによるインデックスでのソート
# インデックスで降順にソート
sorted_df = df.sort_index(ascending=False)
print(sorted_df)
出力:
名前 年齢 得点
3 鈴木 28 95
2 佐藤 22 75
1 山田 30 90
0 田中 25 85
欠損値の処理
データ解析において、欠損値(NaN)の適切な処理は非常に重要です。実務上扱うデータは完璧なデータであることは稀で、アンケートなどの人力で集めたデータであったりシステムの故障などで発生するエラーがデータに含まれたりといったことが頻繁に起こります。
そのため、データを扱う時の初手として欠損値の存在有無とその量や分布を見る癖をつけるようにしましょう。
Pandasでも欠損値を扱うための便利なメソッドを提供しています。
欠損値の検出
isnull()
: 欠損値をTrue
、それ以外をFalse
として返します。notnull()
: 欠損値をFalse
、それ以外をTrue
として返します。
使用例
import pandas as pd
import numpy as np
data = {
'名前': ['田中', '山田', np.nan, '鈴木'],
'年齢': [25, np.nan, 22, 28],
'得点': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)
print(df.isnull())
出力:
名前 年齢 得点
0 False False False
1 False True False
2 True False True
3 False False False
また、得られた結果から列ごとにどれくらいの欠損値があるかを確認する操作をよく行います。
print(df.isnull().sum())
出力:
名前 1
年齢 1
得点 1
dtype: int64
各列ごとに欠損値が1つずつ存在することが確認できました。
欠損値の削除
dropna()
: 欠損値を含む行や列を削除します。
行の削除
# 欠損値を含む行を削除
cleaned_df = df.dropna()
print(cleaned_df)
出力:
名前 年齢 得点
0 田中 25 85
3 鈴木 28 95
列の削除
# 欠損値を含む列を削除
cleaned_df = df.dropna(axis=1)
print(cleaned_df)
出力:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
欠損値の置換
fillna()
: 欠損値を特定の値や方法で埋めます。
固定値で置換
# 欠損値を0で置換
filled_df = df.fillna(0)
print(filled_df)
出力:
名前 年齢 得点
0 田中 25.0 85.0
1 山田 0.0 90.0
2 0.0 22.0 0.0
3 鈴木 28.0 95.0
列ごとに異なる値で置換
# 列ごとに異なる値で置換(今回はmedian:中央値で埋める)
filled_df = df.fillna({'名前': '不明', '年齢': df['年齢'].mean(), '得点': df['得点'].median()})
print(filled_df)
出力:
名前 年齢 得点
0 田中 25.00 85.0
1 山田 25.00 90.0
2 不明 22.00 87.5
3 鈴木 28.00 95.0
欠損値の線形補間
# 前後の値を使って線形補間
filled_df = df.interpolate()
print(filled_df)
出力:
名前 年齢 得点
0 田中 25.0 85.0
1 山田 23.5 90.0
2 山田 22.0 92.5
3 鈴木 28.0 95.0
まとめ
本記事では、Pandasの基本的な使い方から実践的なデータ操作方法までを解説しました。
Pandasはデータ解析や機械学習の前処理において不可欠なツールです。
今回紹介した内容を基礎として、さらに高度なデータ分析や可視化に挑戦してみてください。
演習問題
以下の演習問題に取り組んで、Pandasの理解を深めましょう。
問題 1: Seriesの作成
任意のデータを用いて、Seriesを作成してください。インデックスもカスタマイズしてみましょう。
解答例:
import pandas as pd
# シリーズの作成
s = pd.Series([100, 200, 300], index=['x', 'y', 'z'])
print(s)
問題 2: DataFrameの作成
以下のデータを用いて、DataFrameを作成してください。
- ‘商品’: [‘りんご’, ‘バナナ’, ‘オレンジ’]
- ‘価格’: [120, 100, 150]
- ‘在庫’: [30, 50, 20]
解答例:
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'オレンジ'],
'価格': [120, 100, 150],
'在庫': [30, 50, 20]
}
df = pd.DataFrame(data)
print(df)
問題 3: CSVファイルのカラム名変更と書き出し
以下のCSVファイルを読み込み、カラム名を英語に変更した後、新しいCSVファイルとして書き出してください。
- 元のカラム名: [‘ユーザーID’, ‘フォロー’, ‘フォロワー’, ‘いいね’]
- 新しいカラム名: [‘user_id’, ‘follow’, ‘follower’, ‘like’]
解答例:
import pandas as pd
# CSVファイルの読み込み
df = pd.read_csv('social_data.csv')
# カラム名の変更
df.columns = ['user_id', 'follow', 'follower', 'like']
# 新しいCSVファイルへの書き出し
df.to_csv('output_social_data.csv', index=False)
問題 4: 辞書データからDataFrameの作成
以下の辞書データを用いて、DataFrameを作成してください。
d1 = {
'data1': ['a', 'b', 'c', 'd', 'c', 'a'],
'data2': range(6)
}
解答例:
import pandas as pd
d1 = {
'data1': ['a', 'b', 'c', 'd', 'c', 'a'],
'data2': range(6)
}
df = pd.DataFrame(d1)
print(df)
問題 5: DataFrameの書き出し
問題4で作成したDataFrameを、CSVファイルとExcelファイルとしてそれぞれ書き出してください。
解答例:
# CSVファイルへの書き出し
df.to_csv('d1_data.csv', index=False)
# Excelファイルへの書き出し
df.to_excel('d1_data.xlsx', index=False)
問題 6: ファイルの読み込み
問題5で作成したCSVファイルとExcelファイルをそれぞれ読み込んで、内容を表示してください。
解答例:
# CSVファイルの読み込み
df_csv = pd.read_csv('d1_data.csv')
print(df_csv)
# Excelファイルの読み込み
df_excel = pd.read_excel('d1_data.xlsx')
print(df_excel)
問題 7: 新しい列の追加
問題5で作成したExcelファイルを読み込み、新しい列 ‘data3’ を追加して、任意の値を設定してください。
解答例:
# Excelファイルの読み込み
df = pd.read_excel('d1_data.xlsx')
# 新しい列の追加
df['data3'] = ['x', 'y', 'z', 'w', 'v', 'u']
print(df)
問題 8: 行の追加
問題7で作成したDataFrameに、新しい行を追加してください。追加する行の内容は以下とします。
- ‘data1’: ‘e’
- ‘data2’: 6
- ‘data3’: ‘t’
解答例:
# 新しい行の作成
new_row = {'data1': 'e', 'data2': 6, 'data3': 't'}
# 行の追加
df = df.append(new_row, ignore_index=True)
print(df)
これらの演習問題を通じて、Pandasの基本的な操作に慣れることができたでしょうか。引き続き練習と実践を重ねて、データ解析スキルを磨いていきましょう!
コメント