0
0

pandasの基本と応用:データ構造からデータ抽出・加工、統計分析まで

Posted at

はじめに

pandasは、データ分析のためのデータ構造やツールを提供するライブラリです。データフレーム(DataFrame)やシリーズ(Series)というデータ構造を使って、簡単にデータの抽出、加工、分析が可能です。ここでは、pandasの基本的な使い方を書いていきます!

データ構造

pandasは、NumPyを基盤として構築されていますが、より高レベルなデータ操作を可能にしています。主に使用されるデータ構造は以下の2つです。

シリーズ(Series): 一次元の配列で、ラベル(インデックス)が付いています。辞書のようなデータ構造と考えると理解しやすいです。
データフレーム(DataFrame): 二次元のテーブル形式のデータ構造で、行と列にラベルが付いています。エクセルのスプレッドシートのようなものです。

データフレーム作成

まずは、pandasをインポートして、基本的なデータフレームを作成します。

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'Occupation': ['エンジニア', 'デザイナー', '医者']
}

df = pd.DataFrame(data)
print(df)

出力結果↓

      Name  Age Occupation
0     Alice   25   Engineer
1       Bob   30   Designer
2   Charlie   35     Doctor

データの抽出

データフレームから特定の行や列を抽出する基本的な方法を紹介します。

・列の抽出
データフレームの特定の列を抽出するには、列名を指定します。列名を指定する方法には、角括弧を使う方法と、ドットを使う方法の2つがあります。

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Occupation': ['Engineer', 'Designer', 'Doctor']
}

df = pd.DataFrame(data)

# 'Name'列を抽出
names = df['Name']
print(names)

出力結果↓

0      Alice
1        Bob
2    Charlie
Name: Name, dtype: object

・複数の列を抽出する

# 'Name'と'Occupation'列を抽出
subset = df[['Name', 'Occupation']]
print(subset)

出力結果↓

       Name Occupation
0     Alice   Engineer
1       Bob   Designer
2   Charlie     Doctor

・行の抽出
インデックスを使って行を抽出することができます。インデックスには、整数インデックス(位置)を使う方法と、ラベル(行ラベル)を使う方法があります。

ilocを使うと、整数インデックスを使って行を抽出できます。

# インデックスが1の行を抽出
row = df.iloc[1]
print(row)

出力結果↓

Name          Bob
Age            30
Occupation  Designer
Name: 1, dtype: object

locを使うと、ラベルを使って行を抽出できます。

# 行ラベルが1の行を抽出
row = df.loc[1]
print(row)

出力結果は上記と同じになります。

・複数の行を抽出する
複数の行を抽出する場合は、インデックスやラベルのリストを使います。

# インデックスが0と2の行を抽出
rows = df.iloc[[0, 2]]
print(rows)

出力結果↓

       Name  Age Occupation
0     Alice   25   Engineer
2   Charlie   35     Doctor

・ 条件に基づく抽出

Ageが30以上の行を抽出しています。

# 'Age'が30以上の行を抽出
filtered_df = df[df['Age'] >= 30]
print(filtered_df)

出力結果↓

       Name  Age Occupation
1       Bob   30   Designer
2   Charlie   35     Doctor

・複数の条件を使った抽出
複数の条件を組み合わせて抽出する場合は、ANDやORを使います。

# 'Age'が30以上かつ'Occupation'が'Doctor'の行を抽出
filtered_df = df[(df['Age'] >= 30) & (df['Occupation'] == 'Doctor')]
print(filtered_df)

出力結果↓

       Name  Age Occupation
2   Charlie   35     Doctor

データ加工

pandasではデータ分析の前処理やクリーニング、解析のために、データの追加、削除、変換、集計、再構成など、さまざまなデータ加工がサポートされています。

・新しい列の追加
計算結果や他の列の情報を使って、新しい列を追加することができます。

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Occupation': ['Engineer', 'Designer', 'Doctor']
}

df = pd.DataFrame(data)

# 'Age'に1を加えた新しい列'New Age'を追加
df['New Age'] = df['Age'] + 1
print(df)

出力結果↓

       Name  Age Occupation  New Age
0     Alice   25   Engineer       26
1       Bob   30   Designer       31
2   Charlie   35     Doctor       36

・列の削除
不要な列を削除するには、drop()メソッドを使用します。axis=1で列を削除することを指定します。

# 'New Age'列を削除
df = df.drop('New Age', axis=1)
print(df)

出力結果↓

       Name  Age Occupation
0     Alice   25   Engineer
1       Bob   30   Designer
2   Charlie   35     Doctor

・行の追加
新しい行を追加するには、locまたはappend()メソッドを使用します。

# 新しい行を追加
new_row = pd.Series({'Name': 'David', 'Age': 40, 'Occupation': 'Artist'})
df = df.append(new_row, ignore_index=True)
print(df)

出力結果↓

       Name  Age Occupation
0     Alice   25   Engineer
1       Bob   30   Designer
2   Charlie   35     Doctor
3     David   40     Artist

・データの置換
特定の値を他の値に置き換えるには、replace()メソッドを使用します。

# 'Occupation'列の'Engineer'を'Architect'に置換
df['Occupation'] = df['Occupation'].replace('Engineer', 'Architect')
print(df)

出力結果↓

       Name  Age Occupation
0     Alice   25  Architect
2   Charlie   35     Doctor
3     David   40     Artist

・データの集計
pandasでは、さまざまな集計関数を使用して、データを集計できます。

# 'Age'列の合計を計算
total_age = df['Age'].sum()
print(f'年齢の合計: {total_age}')

出力結果↓

年齢の合計: 100
# 'Age'列の平均を計算
mean_age = df['Age'].mean()
print(f'平均年齢: {mean_age}')

出力結果↓

平均年齢: 33.333333333333336

・グループ化して集計
groupbyメソッドを使用すると、特定のカテゴリでデータをグループ化し、集計を行うことができます。

# 'Occupation'ごとの平均年齢を計算
grouped = df.groupby('Occupation')['Age'].mean()
print(grouped)

出力結果↓

Occupation
Architect    25.0
Senior       37.5
Name: Age, dtype: float64

・データの再構成
pivot_tableメソッドを使用すると、データをピボットテーブル形式に再構成できます。

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'Occupation': ['Engineer', 'Designer', 'Doctor', 'Artist'],
    'Salary': [50000, 55000, 60000, 65000]
}

df = pd.DataFrame(data)

# 'Occupation'ごとの平均給与をピボットテーブルで表示
pivot_table = df.pivot_table(values='Salary', index='Occupation', aggfunc='mean')
print(pivot_table)

出力結果↓

            Salary
Occupation        
Artist      65000.0
Designer    55000.0
Doctor      60000.0
Engineer    50000.0

・データの変形
meltメソッドは、データフレームを縦長の形式に変形します。これは、データの長形式への変換に便利です。

# データフレームを縦長の形式に変形
melted = pd.melt(df, id_vars=['Name'], value_vars=['Age', 'Salary'])
print(melted)

出力結果↓

      Name variable  value
0    Alice      Age     25
1      Bob      Age     30
2  Charlie      Age     35
3    David      Age     40
4    Alice   Salary  50000
5      Bob   Salary  55000
6  Charlie   Salary  60000
7    David   Salary  65000

・行方向の結合
concatメソッドを使用して、複数のデータフレームを行方向に結合することができます。

df1 = pd.DataFrame({
    'Name': ['Alice', 'Bob'],
    'Age': [25, 30]
})

df2 = pd.DataFrame({
    'Name': ['Charlie', 'David'],
    'Age': [35, 40]
})

# 行方向に結合
df_concat = pd.concat([df1, df2], ignore_index=True)
print(df_concat)

出力結果↓

       Name  Age
0     Alice   25
1       Bob   30
2   Charlie   35
3     David   40

 ・列方向の結合
mergeメソッドを使用して、共通のキーを使ってデータフレームを結合することができます。

left = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35]
})

right = pd.DataFrame({
    'Name': ['Bob', 'Charlie', 'David'],
    'Salary': [55000, 60000, 65000]
})

# 'Name'をキーとして結合
df_merged = pd.merge(left, right, on='Name', how='inner')
print(df_merged)

出力結果↓

      Name  Age  Salary
0      Bob   30   55000
1  Charlie   35   60000

統計

pandasは統計量の計算もできます。基本的な統計量を計算するメソッドを紹介します。

・要約統計量の表示
describe()メソッドは、データの要約統計量を計算し、以下の統計量を表示することができます。

count: 欠損値を除いたデータの個数
mean: 平均値
std: 標準偏差
min: 最小値
25%: 第1四分位数(データの下位25%の値)
50%: 中央値(第2四分位数、データの中央値)
75%: 第3四分位数(データの上位25%の値)
max: 最大値

data = {
    'Age': [23, 25, 28, 22, 30, 35, 40],
    'Salary': [50000, 55000, 60000, 52000, 58000, 62000, 64000]
}

df = pd.DataFrame(data)
summary = df.describe()
print(summary)

出力結果↓

             Age        Salary
count   7.000000      7.000000
mean   29.000000  57333.333333
std     6.627722   5195.962293
min    22.000000  50000.000000
25%    24.500000  53000.000000
50%    28.000000  58000.000000
75%    33.750000  61000.000000
max    40.000000  64000.000000

・平均値
mean()メソッドは、各列の平均値を計算します。

mean_age = df['Age'].mean()
mean_salary = df['Salary'].mean()
print(f'平均年齢: {mean_age}')
print(f'平均給与: {mean_salary}')

出力結果↓

平均年齢: 29.0
平均給与: 57333.333333333336

・中央値
median()メソッドは、データの中央値を計算します。

median_age = df['Age'].median()
median_salary = df['Salary'].median()
print(f'年齢の中央値: {median_age}')
print(f'給与の中央値: {median_salary}')

出力結果↓

年齢の中央値: 28.0
給与の中央値: 58000.0

・分散
var()メソッドは、各列の分散を計算します。

variance_age = df['Age'].var()
variance_salary = df['Salary'].var()
print(f'年齢の分散: {variance_age}')
print(f'給与の分散: {variance_salary}')

出力結果↓

年齢の分散: 43.916666666666664
給与の分散: 26995000.0

・標準偏差
std()メソッドは、各列の標準偏差を計算します。

std_age = df['Age'].std()
std_salary = df['Salary'].std()
print(f'年齢の標準偏差: {std_age}')
print(f'給与の標準偏差: {std_salary}')

出力結果↓

年齢の標準偏差: 6.627722214849324
給与の標準偏差: 5195.962293475344

・最小値と最大値
min()とmax()メソッドは、各列の最小値と最大値をそれぞれ計算します。

min_age = df['Age'].min()
max_age = df['Age'].max()
min_salary = df['Salary'].min()
max_salary = df['Salary'].max()
print(f'最小年齢: {min_age}, 最大年齢: {max_age}')
print(f'最小給与: {min_salary}, 最大給与: {max_salary}')

出力結果↓

最小年齢: 22, 最大年齢: 40
最小給与: 50000, 最大給与: 64000

ラベリング

データフレームやシリーズの行や列に対して名前やラベルを付けて、データを視覚的に理解しやすくすることで簡単にデータ操作や分析を行えるようにできます。

データフレームやシリーズのラベリングには、インデックス(行ラベル)と列ラベルの2種類があります。

・インデックスの設定

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Occupation': ['Engineer', 'Designer', 'Doctor']
}

# インデックスを指定してデータフレームを作成
df = pd.DataFrame(data, index=['A', 'B', 'C'])
print(df)

出力結果↓

     Name  Age Occupation
A   Alice   25   Engineer
B     Bob   30   Designer
C Charlie   35     Doctor

・インデックスの再設定
既存のデータフレームのインデックスを変更するには、set_index()メソッドを使用します。例えば、特定の列をインデックスとして使用したい場合に便利です。

# 'Name'列をインデックスとして設定
df = df.set_index('Name')
print(df)

出力結果↓

          Age Occupation
Name                    
Alice      25   Engineer
Bob        30   Designer
Charlie    35     Doctor

・インデックスのリセット
インデックスをリセットして、デフォルトの整数インデックスに戻したい場合は、reset_index()メソッドを使用します。

# インデックスをリセット
df = df.reset_index()
print(df)

出力結果↓

       Name  Age Occupation
0     Alice   25   Engineer
1       Bob   30   Designer
2   Charlie   35     Doctor

・列ラベルの変更
既存のデータフレームの列ラベルを変更するには、columns属性を使います。

# 列ラベルを変更
df.columns = ['Full Name', 'Years', 'Job Title']
print(df)

出力結果↓

    Full Name  Years   Job Title
0       Alice     25   Engineer
1         Bob     30   Designer
2     Charlie     35     Doctor

・特定の列ラベルを変更
データフレームの一部の列ラベルだけを変更したい場合は、rename()メソッドを使用します。

# 'Full Name'を'Name'に変更
df = df.rename(columns={'Full Name': 'Name'})
print(df)

出力結果↓

      Name  Years   Job Title
0    Alice     25   Engineer
1      Bob     30   Designer
2  Charlie     35     Doctor

まとめ

pandasは、Pythonでのデータ操作や分析において非常に強力なツールです。データフレームやシリーズといったデータ構造を使って、データの抽出、加工、分析を効率的に行うことができます。これらをマスターすることで、より複雑なデータ分析や機械学習の前処理を行う際にも役立つと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0