[Python] Pandasの基本的な使い方をわかりやすく解説
PandasはPythonでデータ操作や分析を行うためのライブラリです。
主に Series
と DataFrame
という2つのデータ構造を使用します。
Seriesは1次元のデータ、DataFrameは2次元のデータを扱います。
データの読み込みにはread_csv()
などを使い、データの表示にはhead()
やtail()
を使用します。
データのフィルタリングや集計にはloc[]
やgroupby()
が便利です。
データの欠損値処理にはisnull()
やfillna()
を使用します。
Pandasとは?基本の理解
Pandasは、Pythonでデータ操作や分析を行うためのライブラリです。
特に、表形式のデータを扱うのに非常に便利で、データの読み込み、加工、集計、可視化などを簡単に行うことができます。
Pandasは、データサイエンスや機械学習の分野で広く使用されています。
Pandasの特徴
特徴 | 説明 |
---|---|
データ構造 | Series(1次元)とDataFrame(2次元)を提供 |
データの操作 | フィルタリング、グループ化、集計が容易 |
データの入出力 | CSV、Excel、SQLなど多様なフォーマットに対応 |
時系列データ処理 | 日付や時間に基づくデータの操作が簡単 |
高速な処理 | NumPyを基盤にしており、高速な計算が可能 |
SeriesとDataFrameの違い
- Series: 一次元のラベル付き配列で、データのインデックスを持ちます。
例えば、特定の列のデータを表現するのに適しています。
- DataFrame: 二次元のラベル付きデータ構造で、複数のSeriesを持つことができます。
行と列の両方にインデックスがあり、表形式のデータを扱うのに最適です。
Pandasのインストール方法
Pandasは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。
以下のコマンドを実行してください。
pip install pandas
Pandasの基本的な使い方の流れ
- ライブラリのインポート: Pandasを使用するために、まずライブラリをインポートします。
import pandas as pd
- データの読み込み: CSVファイルやExcelファイルなどからデータを読み込みます。
df = pd.read_csv('data.csv')
- データの確認: データの内容を確認するために、
head()
やinfo()メソッド
を使用します。
print(df.head())
- データの操作: フィルタリングや集計などの操作を行います。
filtered_data = df[df['column_name'] > 10]
- データの出力: 処理したデータをCSVファイルなどに書き出します。
df.to_csv('output.csv', index=False)
この流れを理解することで、Pandasを使ったデータ分析の基本的な操作ができるようになります。
DataFrameの作成と基本操作
Pandasの中心的なデータ構造であるDataFrameは、表形式のデータを扱うための非常に便利なツールです。
ここでは、DataFrameの作成方法や基本的な操作について解説します。
DataFrameの作成方法
DataFrameはさまざまな方法で作成できます。
以下に代表的な方法を示します。
リストからのDataFrame作成
リストを使って簡単にDataFrameを作成できます。
以下のコードでは、リストのリストを使ってDataFrameを作成しています。
import pandas as pd
data = [[1, 'Alice', 23], [2, 'Bob', 30], [3, 'Charlie', 22]]
df = pd.DataFrame(data, columns=['ID', 'Name', 'Age'])
print(df)
ID Name Age
0 1 Alice 23
1 2 Bob 30
2 3 Charlie 22
辞書からのDataFrame作成
辞書を使ってDataFrameを作成することもできます。
辞書のキーが列名、値がその列のデータになります。
import pandas as pd
data = {
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [23, 30, 22]
}
df = pd.DataFrame(data)
print(df)
ID Name Age
0 1 Alice 23
1 2 Bob 30
2 3 Charlie 22
CSVファイルからのDataFrame作成
CSVファイルからDataFrameを作成するには、read_csv()メソッド
を使用します。
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
DataFrameの表示
DataFrameの内容を確認するためのメソッドがいくつかあります。
head()とtail()でデータの一部を確認
head()メソッド
は最初の5行を表示し、tail()メソッド
は最後の5行を表示します。
print(df.head()) # 最初の5行を表示
print(df.tail()) # 最後の5行を表示
info()とdescribe()でデータの概要を確認
info()メソッド
はDataFrameの構造を、describe()メソッド
は数値データの統計情報を表示します。
print(df.info()) # DataFrameの情報を表示
print(df.describe()) # 統計情報を表示
列・行の選択と抽出
DataFrameから特定の列や行を選択する方法を見ていきます。
列の選択:[]とloc[]
列を選択するには、[]
を使う方法とloc[]
を使う方法があります。
# 列の選択
name_column = df['Name'] # []を使った列の選択
age_column = df.loc[:, 'Age'] # loc[]を使った列の選択
行の選択:iloc[]とloc[]
行を選択するには、iloc[]
(整数位置)とloc[]
(ラベル)を使用します。
# 行の選択
first_row = df.iloc[0] # 最初の行を選択
specific_row = df.loc[1] # ラベルを使った行の選択
データのソート
DataFrameのデータをソートする方法について説明します。
sort_values()で値を基準にソート
sort_values()メソッド
を使って、特定の列の値を基準にデータをソートできます。
sorted_df = df.sort_values(by='Age') # 年齢でソート
print(sorted_df)
sort_index()でインデックスを基準にソート
sort_index()メソッド
を使って、インデックスを基準にデータをソートできます。
sorted_index_df = df.sort_index() # インデックスでソート
print(sorted_index_df)
これらの基本操作を理解することで、Pandasを使ったデータ分析がよりスムーズに行えるようになります。
データのフィルタリングと条件検索
Pandasを使用すると、DataFrame内のデータを条件に基づいてフィルタリングすることができます。
これにより、特定の条件を満たすデータを簡単に抽出できます。
ここでは、条件に基づくデータの抽出方法について解説します。
条件に基づくデータの抽出
単一条件でのフィルタリング
単一の条件を使ってデータをフィルタリングするには、条件式を用いてBooleanインデックスを作成します。
以下の例では、年齢が25歳以上のデータを抽出しています。
import pandas as pd
data = {
'ID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [23, 30, 22, 35]
}
df = pd.DataFrame(data)
# 年齢が25歳以上のデータを抽出
filtered_data = df[df['Age'] >= 25]
print(filtered_data)
ID Name Age
1 2 Bob 30
3 4 David 35
複数条件でのフィルタリング
複数の条件を組み合わせてデータをフィルタリングすることも可能です。
条件を組み合わせる際は、&
(AND)や|
(OR)を使用します。
以下の例では、年齢が25歳以上かつ名前が’Bob’のデータを抽出しています。
# 年齢が25歳以上かつ名前が'Bob'のデータを抽出
filtered_data_multiple = df[(df['Age'] >= 25) & (df['Name'] == 'Bob')]
print(filtered_data_multiple)
ID Name Age
1 2 Bob 30
isin()で特定の値を持つデータの抽出
isin()メソッド
を使用すると、特定の値のリストに含まれるデータを簡単に抽出できます。
以下の例では、名前が’Alice’または’Charlie’のデータを抽出しています。
# 名前が'Alice'または'Charlie'のデータを抽出
filtered_data_isin = df[df['Name'].isin(['Alice', 'Charlie'])]
print(filtered_data_isin)
ID Name Age
0 1 Alice 23
2 3 Charlie 22
between()で範囲指定のデータ抽出
between()メソッド
を使用すると、指定した範囲内の値を持つデータを抽出できます。
以下の例では、年齢が20歳から30歳のデータを抽出しています。
# 年齢が20歳から30歳のデータを抽出
filtered_data_between = df[df['Age'].between(20, 30)]
print(filtered_data_between)
ID Name Age
0 1 Alice 23
1 2 Bob 30
2 3 Charlie 22
これらのフィルタリング手法を活用することで、必要なデータを効率的に抽出し、分析を行うことができます。
データの集計と統計処理
Pandasを使用すると、データの集計や統計処理を簡単に行うことができます。
ここでは、基本的な統計量の計算、データのグループ化と集計、ピボットテーブルの作成について解説します。
基本的な統計量の計算
Pandasには、データの基本的な統計量を計算するための便利なメソッドが用意されています。
mean()で平均値を計算
mean()メソッド
を使用すると、指定した列の平均値を計算できます。
以下の例では、年齢の平均値を計算しています。
import pandas as pd
data = {
'ID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [23, 30, 22, 35]
}
df = pd.DataFrame(data)
# 年齢の平均値を計算
average_age = df['Age'].mean()
print(f'平均年齢: {average_age}')
平均年齢: 27.5
sum()で合計を計算
sum()メソッド
を使用すると、指定した列の合計を計算できます。
以下の例では、年齢の合計を計算しています。
# 年齢の合計を計算
total_age = df['Age'].sum()
print(f'合計年齢: {total_age}')
合計年齢: 110
count()でデータ数をカウント
count()メソッド
を使用すると、指定した列のデータ数をカウントできます。
以下の例では、年齢のデータ数をカウントしています。
# 年齢のデータ数をカウント
count_age = df['Age'].count()
print(f'年齢のデータ数: {count_age}')
年齢のデータ数: 4
グループ化と集計
データをグループ化して集計することで、より詳細な分析が可能になります。
groupby()でデータをグループ化
groupby()メソッド
を使用すると、指定した列に基づいてデータをグループ化できます。
以下の例では、年齢を基準にデータをグループ化しています。
# 年齢でデータをグループ化
grouped_data = df.groupby('Age')
print(grouped_data.size()) # 各年齢のデータ数を表示
Age
22 1
23 1
30 1
35 1
dtype: int64
agg()で複数の集計関数を適用
agg()メソッド
を使用すると、グループ化したデータに対して複数の集計関数を適用できます。
以下の例では、年齢ごとのデータ数と平均を計算しています。
# 年齢でグループ化し、データ数と平均を計算
aggregated_data = df.groupby('Age').agg(['count', 'mean'])
print(aggregated_data)
ID
count mean
Age
22 1 3.0
23 1 3.0
30 1 3.0
35 1 3.0
ピボットテーブルの作成
ピボットテーブルを使用すると、データを集計して視覚的に表示することができます。
pivot_table()の使い方
pivot_table()メソッド
を使用して、特定の列をインデックス、列、値として指定し、集計を行います。
以下の例では、年齢をインデックス、名前を列、IDの数を値としてピボットテーブルを作成しています。
# ピボットテーブルの作成
pivot_table = pd.pivot_table(df, values='ID', index='Age', columns='Name', aggfunc='count', fill_value=0)
print(pivot_table)
Name Alice Bob Charlie David
Age
22 0 0 1 0
23 1 0 0 0
30 0 1 0 0
35 0 0 0 1
これにより、年齢ごとの各名前の出現数を視覚的に確認することができます。
データの集計と統計処理を活用することで、より深い洞察を得ることが可能になります。
データのクリーニング
データ分析を行う上で、データのクリーニングは非常に重要なステップです。
データには欠損値や重複データが含まれていることが多く、これらを適切に処理することで、分析結果の信頼性を高めることができます。
ここでは、欠損値の処理、重複データの処理、データ型の変換について解説します。
欠損値の処理
欠損値は、データの一部が欠けている状態を指します。
Pandasでは、欠損値を簡単に確認・処理することができます。
isnull()とnotnull()で欠損値を確認
isnull()メソッド
を使用すると、欠損値があるかどうかを確認できます。
逆に、notnull()メソッド
を使用すると、欠損値でないデータを確認できます。
import pandas as pd
data = {
'ID': [1, 2, 3, 4],
'Name': ['Alice', None, 'Charlie', 'David'],
'Age': [23, 30, None, 35]
}
df = pd.DataFrame(data)
# 欠損値の確認
print(df.isnull()) # 欠損値があるかどうかを表示
ID Name Age
0 False False False
1 False True False
2 False False True
3 False False False
fillna()で欠損値を埋める
fillna()メソッド
を使用すると、欠損値を特定の値で埋めることができます。
以下の例では、欠損値を0で埋めています。
# 欠損値を0で埋める
df_filled = df.fillna(0)
print(df_filled)
ID Name Age
0 1 Alice 23.0
1 2 0 30.0
2 3 Charlie 0.0
3 4 David 35.0
dropna()で欠損値を削除
dropna()メソッド
を使用すると、欠損値を含む行を削除できます。
以下の例では、欠損値を含む行を削除しています。
# 欠損値を含む行を削除
df_dropped = df.dropna()
print(df_dropped)
ID Name Age
0 1 Alice 23.0
1 2 0 30.0
3 4 David 35.0
重複データの処理
重複データは、同じデータが複数回存在する状態を指します。
これを適切に処理することで、分析結果の精度を向上させることができます。
duplicated()で重複を確認
duplicated()メソッド
を使用すると、重複している行を確認できます。
以下の例では、重複行の有無を確認しています。
# 重複行の確認
duplicates = df.duplicated()
print(duplicates)
0 False
1 False
2 False
3 False
dtype: bool
drop_duplicates()で重複を削除
drop_duplicates()メソッド
を使用すると、重複行を削除できます。
以下の例では、重複行を削除しています。
# 重複行を削除
df_unique = df.drop_duplicates()
print(df_unique)
ID Name Age
0 1 Alice 23.0
1 2 0 30.0
2 3 Charlie 0.0
3 4 David 35.0
データ型の変換
データ型の変換は、データの正確な処理において重要です。
Pandasでは、データ型を簡単に変換できます。
astype()でデータ型を変換
astype()メソッド
を使用すると、指定したデータ型に変換できます。
以下の例では、年齢を整数型に変換しています。
# 年齢を整数型に変換
df['Age'] = df['Age'].astype(int)
print(df)
ID Name Age
0 1 Alice 23
1 2 0 30
2 3 Charlie 0
3 4 David 35
to_datetime()で日付型に変換
to_datetime()メソッド
を使用すると、文字列を日付型に変換できます。
以下の例では、日付の文字列を日付型に変換しています。
# 日付の文字列を日付型に変換
date_data = {
'Date': ['2023-01-01', '2023-02-01', '2023-03-01']
}
df_dates = pd.DataFrame(date_data)
df_dates['Date'] = pd.to_datetime(df_dates['Date'])
print(df_dates)
Date
0 2023-01-01
1 2023-02-01
2 2023-03-01
データのクリーニングを行うことで、分析に適したデータセットを作成し、より正確な結果を得ることができます。
データの結合と結合操作
Pandasでは、複数のDataFrameを結合することで、より大きなデータセットを作成することができます。
ここでは、DataFrameの結合方法とインデックスの操作について解説します。
複数のDataFrameを結合する
複数のDataFrameを結合する方法には、concat()メソッド
とmerge()メソッド
があります。
concat()で縦・横に結合
concat()メソッド
を使用すると、DataFrameを縦または横に結合できます。
以下の例では、2つのDataFrameを縦に結合しています。
import pandas as pd
data1 = {
'ID': [1, 2],
'Name': ['Alice', 'Bob']
}
data2 = {
'ID': [3, 4],
'Name': ['Charlie', 'David']
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 縦に結合
df_concat_vertical = pd.concat([df1, df2], axis=0)
print(df_concat_vertical)
ID Name
0 1 Alice
1 2 Bob
0 3 Charlie
1 4 David
横に結合する場合は、axis=1
を指定します。
# 横に結合
df_concat_horizontal = pd.concat([df1, df2], axis=1)
print(df_concat_horizontal)
ID Name ID Name
0 1 Alice 3 Charlie
1 2 Bob 4 David
merge()でキーを基に結合
merge()メソッド
を使用すると、特定のキーを基にDataFrameを結合できます。
以下の例では、共通の列ID
を基に2つのDataFrameを結合しています。
data3 = {
'ID': [1, 2, 3],
'Age': [23, 30, 22]
}
df3 = pd.DataFrame(data3)
# IDを基に結合
df_merged = pd.merge(df1, df3, on='ID')
print(df_merged)
ID Name Age
0 1 Alice 23
1 2 Bob 30
インデックスの操作
DataFrameのインデックスを操作することで、データの管理が容易になります。
set_index()でインデックスを設定
set_index()メソッド
を使用すると、指定した列をインデックスとして設定できます。
以下の例では、ID
列をインデックスに設定しています。
# IDをインデックスに設定
df_set_index = df1.set_index('ID')
print(df_set_index)
Name
ID
1 Alice
2 Bob
reset_index()でインデックスをリセット
reset_index()メソッド
を使用すると、インデックスをリセットして、元の列に戻すことができます。
以下の例では、インデックスをリセットしています。
# インデックスをリセット
df_reset_index = df_set_index.reset_index()
print(df_reset_index)
ID Name
0 1 Alice
1 2 Bob
これらの結合操作やインデックスの操作を活用することで、データの整理や分析がより効率的に行えるようになります。
データの可視化
データの可視化は、分析結果を理解しやすくするための重要な手段です。
Pandasを使用すると、簡単にグラフを作成することができます。
ここでは、Pandasでの基本的なグラフ作成方法と、Matplotlibとの連携について解説します。
Pandasでの簡単なグラフ作成
Pandasには、データを可視化するための便利なメソッドが用意されています。
plot()で折れ線グラフを作成
plot()メソッド
を使用すると、折れ線グラフを簡単に作成できます。
以下の例では、年齢に基づくデータを折れ線グラフで表示しています。
import pandas as pd
import matplotlib.pyplot as plt
data = {
'ID': [1, 2, 3, 4],
'Age': [23, 30, 22, 35]
}
df = pd.DataFrame(data)
# 折れ線グラフを作成
df.plot(x='ID', y='Age', kind='line', marker='o')
plt.title('ID vs Age')
plt.xlabel('ID')
plt.ylabel('Age')
plt.grid()
plt.show()
このコードを実行すると、IDに対する年齢の折れ線グラフが表示されます。
bar()で棒グラフを作成
bar()メソッド
を使用すると、棒グラフを作成できます。
以下の例では、年齢のデータを棒グラフで表示しています。
# 棒グラフを作成
df.plot(x='ID', y='Age', kind='bar', color='skyblue')
plt.title('ID vs Age')
plt.xlabel('ID')
plt.ylabel('Age')
plt.xticks(rotation=0) # x軸のラベルを水平に
plt.show()
このコードを実行すると、IDに対する年齢の棒グラフが表示されます。
hist()でヒストグラムを作成
hist()メソッド
を使用すると、ヒストグラムを作成できます。
以下の例では、年齢の分布をヒストグラムで表示しています。
# ヒストグラムを作成
df['Age'].hist(bins=5, color='lightgreen', edgecolor='black')
plt.title('Age Distribution')
plt.xlabel('Age')
plt.ylabel('Frequency')
plt.grid()
plt.show()
このコードを実行すると、年齢の分布を示すヒストグラムが表示されます。
Matplotlibとの連携
Pandasの可視化機能はMatplotlibを基盤にしているため、Matplotlibを使用してグラフをカスタマイズすることができます。
plot()でMatplotlibを利用したカスタマイズ
Pandasのplot()メソッド
を使用した後に、Matplotlibの機能を使ってさらにカスタマイズすることができます。
以下の例では、折れ線グラフにカスタマイズを加えています。
# 折れ線グラフを作成
ax = df.plot(x='ID', y='Age', kind='line', marker='o', color='orange')
# Matplotlibを使ったカスタマイズ
plt.title('ID vs Age with Customization')
plt.xlabel('ID')
plt.ylabel('Age')
plt.grid()
plt.axhline(y=df['Age'].mean(), color='red', linestyle='--', label='Average Age') # 平均年齢の線を追加
plt.legend()
plt.show()
このコードを実行すると、平均年齢を示す赤い破線が追加された折れ線グラフが表示されます。
これらの可視化手法を活用することで、データの分析結果を視覚的に表現し、より深い洞察を得ることができます。
応用例:実際のデータ分析でのPandas活用
Pandasは、さまざまなデータソースからデータを取得し、分析するための強力なツールです。
ここでは、実際のデータ分析におけるPandasの活用方法について、いくつかの応用例を紹介します。
CSVファイルを使ったデータ分析
CSVファイルは、データ分析でよく使用されるフォーマットの一つです。
Pandasを使用すると、CSVファイルを簡単に読み込み、データを分析できます。
import pandas as pd
# CSVファイルの読み込み
df = pd.read_csv('data.csv')
# データの概要を表示
print(df.head())
# 特定の列の平均値を計算
average_value = df['column_name'].mean()
print(f'平均値: {average_value}')
このように、CSVファイルからデータを読み込み、簡単に分析を行うことができます。
Web APIから取得したデータの処理
Pandasは、Web APIから取得したデータを処理するのにも適しています。
以下の例では、requests
ライブラリを使用してAPIからデータを取得し、Pandasで処理しています。
import pandas as pd
import requests
# Web APIからデータを取得
response = requests.get('https://api.example.com/data')
data = response.json()
# DataFrameに変換
df = pd.DataFrame(data)
# データの確認
print(df.head())
この方法を使うことで、リアルタイムのデータを取得し、分析することが可能です。
Excelファイルの読み込みと書き出し
PandasはExcelファイルの読み込みと書き出しもサポートしています。
以下の例では、Excelファイルを読み込み、データを処理した後、別のExcelファイルに書き出しています。
# Excelファイルの読み込み
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# データの処理(例:特定の列の合計を計算)
total_value = df['column_name'].sum()
print(f'合計値: {total_value}')
# 処理したデータを新しいExcelファイルに書き出し
df.to_excel('output.xlsx', index=False)
このように、Excelファイルを使ったデータの入出力が簡単に行えます。
時系列データの処理
Pandasは、時系列データの処理に特化した機能を提供しています。
以下の例では、日付をインデックスに設定し、時系列データを扱っています。
# 日付データを含むDataFrameの作成
data = {
'Date': pd.date_range(start='2023-01-01', periods=5, freq='D'),
'Value': [10, 20, 15, 30, 25]
}
df = pd.DataFrame(data)
# 日付をインデックスに設定
df.set_index('Date', inplace=True)
# 時系列データの移動平均を計算
df['Moving_Average'] = df['Value'].rolling(window=2).mean()
print(df)
このように、Pandasを使用することで、時系列データの分析が容易になります。
大規模データの効率的な処理
Pandasは、大規模データの処理にも対応しています。
chunksize
オプションを使用して、データを分割して読み込むことができます。
以下の例では、大きなCSVファイルを分割して処理しています。
# 大規模CSVファイルの読み込み
chunk_size = 10000 # チャンクサイズを指定
for chunk in pd.read_csv('large_data.csv', chunksize=chunk_size):
# 各チャンクに対して処理を行う
print(chunk.describe())
この方法を使うことで、大規模データを効率的に処理することができます。
これらの応用例を通じて、Pandasの強力な機能を活用し、さまざまなデータ分析のニーズに対応することができます。
まとめ
この記事では、Pandasを使用したデータ分析の基本から応用までのさまざまな機能について解説しました。
データの読み込み、操作、集計、可視化、そしてクリーニングなど、Pandasの強力な機能を活用することで、効率的にデータを扱うことが可能です。
これらの知識を基に、実際のデータ分析プロジェクトに取り組むことで、データから価値ある洞察を引き出すことができるでしょう。