読み込み中...

PythonにおけるDataFrameの基本的な使い方10選

DataFrameの徹底解説 Python
この記事は約25分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●DataFrameとは?なぜ重要?

Pythonでデータ分析を行う際に欠かせないのがDataFrameです。

DataFrameは、表形式のデータを扱うための強力な構造体で、Pandasライブラリの中核を成しています。

エクセルのスプレッドシートのようなイメージを持つと理解しやすいでしょう。

○DataFrameの定義と役割

DataFrameは、行と列で構成される2次元のデータ構造です。

各列には異なるデータ型(数値、文字列、日付など)を格納できるため、多様なデータを効率的に扱えます。

また、インデックスを使用することで、データに簡単にアクセスできる点も特徴です。

DataFrameの主な役割は次の通りです。

  1. データの整理と構造化
  2. 効率的なデータ操作(フィルタリング、ソート、集計など)
  3. データの可視化や統計分析の準備
  4. 大規模データセットの処理

○データ分析や機械学習での活用例

DataFrameは、データサイエンスや機械学習の現場で幅広く活用されています。

例えば、顧客データの分析では、各行が顧客を表し、列には年齢、性別、購買履歴などの情報が含まれます。

機械学習では、特徴量(説明変数)と目的変数をDataFrameで管理することで、モデルの学習や評価を効率的に行えます。

また、時系列データの分析では、日付をインデックスとしたDataFrameを使用することで、簡単に時間軸での集計や可視化が可能になります。

DataFrameをマスターすることで、データ分析の生産性が飛躍的に向上します。

エクセルでは処理が困難な大規模データセットも、DataFrameを使えば効率的に扱えるようになります。

では、具体的なDataFrameの使い方を見ていきましょう。

基本的な操作をマスターすることで、あなたのデータ分析スキルは大きく向上するはずです。

●DataFrameの作成方法

DataFrameの作成は、Pythonでデータ分析を始める最初の一歩です。

データを効率的に扱うために、さまざまな方法でDataFrameを作成できます。

ここでは、リストや辞書からDataFrameを作る方法、そして空のDataFrameを作る方法を詳しく解説します。

○サンプルコード1:リストからDataFrameを作る

リストからDataFrameを作成する方法は、シンプルかつ直感的です。

特に、既存のリストデータをDataFrame形式に変換したい場合に便利です。

import pandas as pd

# リストデータの準備
data = [['Alice', 25, 'New York'], ['Bob', 30, 'San Francisco'], ['Charlie', 35, 'Los Angeles']]

# DataFrameの作成
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])

# 結果の表示
print(df)

実行結果

      Name  Age           City
0   Alice   25       New York
1     Bob   30  San Francisco
2 Charlie   35    Los Angeles

このコードでは、まずpandasライブラリをインポートします。次に、2次元のリストを用意し、それをDataFrameに変換します。

columnsパラメータを使って列名を指定していますが、省略すると自動的に数字のインデックスが割り当てられます。

○サンプルコード2:辞書からDataFrameを作る

辞書からDataFrameを作成する方法も、非常に便利です。

特に、キーと値のペアがすでに存在する場合、辞書形式のデータを直接DataFrameに変換できます。

import pandas as pd

# 辞書データの準備
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['New York', 'San Francisco', 'Los Angeles']}

# DataFrameの作成
df = pd.DataFrame(data)

# 結果の表示
print(df)

実行結果

      Name  Age           City
0   Alice   25       New York
1     Bob   30  San Francisco
2 Charlie   35    Los Angeles

この方法では、辞書のキーが列名になり、値がその列のデータとなります。

辞書形式のデータはPythonでよく使われるため、この方法は特に便利です。

○サンプルコード3:空のDataFrameを作る

時には、最初に空のDataFrameを作成し、後からデータを追加していく必要があります。

特に、データを動的に生成する場合や、大量のデータを少しずつ処理する場合に有用です。

import pandas as pd

# 空のDataFrameを作成
df = pd.DataFrame(columns=['Name', 'Age', 'City'])

# データを追加
df = df.append({'Name': 'Alice', 'Age': 25, 'City': 'New York'}, ignore_index=True)
df = df.append({'Name': 'Bob', 'Age': 30, 'City': 'San Francisco'}, ignore_index=True)

# 結果の表示
print(df)

実行結果

    Name  Age           City
0  Alice   25       New York
1    Bob   30  San Francisco

この方法では、まず列名だけを指定して空のDataFrameを作成し、その後appendメソッドを使ってデータを追加しています。

ignore_index=Trueを指定することで、インデックスが自動的に振り直されます。

●DataFrameへのデータ追加

DataFrameを作成した後、新しいデータを追加する必要が出てくることがあります。

データ分析の過程で新たな情報が得られたり、外部ソースから追加のデータを取得したりする場合などです。

ここでは、DataFrameに新しい行や列を追加する方法を詳しく見ていきましょう。

○サンプルコード4:新しい行の追加

DataFrameに新しい行を追加する方法はいくつかありますが、ここでは主に2つの方法を紹介します。

1つ目はappend()メソッドを使用する方法、2つ目はconcat()関数を使用する方法です。

まずはappend()メソッドを使った例を見てみましょう。

import pandas as pd

# 初期のDataFrameを作成
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})

# 新しい行を追加
new_row = {'Name': 'Charlie', 'Age': 35}
df = df.append(new_row, ignore_index=True)

print(df)

実行結果

     Name  Age
0   Alice   25
1     Bob   30
2 Charlie   35

このコードでは、まず2行のDataFrameを作成し、その後append()メソッドを使って新しい行を追加しています。

ignore_index=Trueを指定することで、インデックスが自動的に振り直されます。

ただし、append()メソッドは将来的に廃止される予定なので、代わりにconcat()関数を使用することをお勧めします。

concat()関数を使用した例を見てみましょう。

import pandas as pd

# 初期のDataFrameを作成
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})

# 新しい行を追加
new_row = pd.DataFrame({'Name': ['Charlie'], 'Age': [35]})
df = pd.concat([df, new_row], ignore_index=True)

print(df)

実行結果

     Name  Age
0   Alice   25
1     Bob   30
2 Charlie   35

concat()関数を使用する場合、新しい行もDataFrame形式で作成し、既存のDataFrameと結合します。

この方法は複数の行を一度に追加する場合にも便利です。

○サンプルコード5:新しい列の追加

DataFrameに新しい列を追加するのは、新しい行を追加するよりも簡単です。

単純に新しい列名を指定し、値を割り当てるだけです。

import pandas as pd

# 初期のDataFrameを作成
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]})

# 新しい列を追加
df['City'] = ['New York', 'San Francisco', 'Los Angeles']

# 条件に基づいて新しい列を追加
df['Is Adult'] = df['Age'] >= 18

print(df)

実行結果

     Name  Age           City  Is Adult
0   Alice   25       New York     True
1     Bob   30  San Francisco     True
2 Charlie   35    Los Angeles     True

このコードでは、まず’City’という新しい列を追加し、各行に対応する都市名を割り当てています。

次に、’Is Adult’という列を追加し、’Age’列の値に基づいて真偽値を設定しています。

新しい列を特定の位置に挿入したい場合は、insert()メソッドを使用します。

import pandas as pd

# 初期のDataFrameを作成
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]})

# 新しい列を特定の位置に挿入
df.insert(1, 'City', ['New York', 'San Francisco', 'Los Angeles'])

print(df)

実行結果

     Name           City  Age
0   Alice       New York   25
1     Bob  San Francisco   30
2 Charlie    Los Angeles   35

insert()メソッドの第1引数は挿入位置のインデックス、第2引数は新しい列名、第3引数は列の値です。

●DataFrameからのデータ抽出

DataFrameを作成し、データを追加した後は、必要な情報を効率的に抽出することが重要です。

データ分析や機械学習のプロジェクトでは、大量のデータから特定の条件を満たすデータを取り出したり、特定の列や行だけを取り出したりする場面が頻繁に発生します。

ここでは、Pythonのpandasライブラリを使用して、DataFrameから効果的にデータを抽出する方法を詳しく見ていきましょう。

○サンプルコード6:特定の行を抽出

DataFrameから特定の行を抽出する方法はいくつかありますが、最も一般的なのは、インデックスを使用する方法と、条件式を使用する方法です。

まずは、インデックスを使用して特定の行を抽出する例を見てみましょう。

import pandas as pd

# サンプルのDataFrameを作成
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 30, 35, 28, 22],
    'City': ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Boston']
})

# インデックスを使用して特定の行を抽出
row = df.loc[2]
print("3番目の行:")
print(row)

# 複数の行を抽出
rows = df.loc[[0, 2, 4]]
print("\n1番目、3番目、5番目の行:")
print(rows)

実行結果

3番目の行:
Name        Charlie
Age              35
City    Los Angeles
Name: 2, dtype: object

1番目、3番目、5番目の行:
     Name  Age         City
0   Alice   25     New York
2 Charlie   35  Los Angeles
4     Eve   22       Boston

このコードでは、loc属性を使用して特定の行を抽出しています。

locは、インデックスラベルを基に行を選択します。

単一の行を選択する場合は整数を、複数の行を選択する場合はリストを使用します。

次に、条件式を使用して特定の行を抽出する例を見てみましょう。

# 条件式を使用して特定の行を抽出
young_people = df[df['Age'] < 30]
print("30歳未満の人々:")
print(young_people)

# 複数の条件を組み合わせて行を抽出
young_new_yorkers = df[(df['Age'] < 30) & (df['City'] == 'New York')]
print("\n30歳未満のニューヨーク在住者:")
print(young_new_yorkers)

実行結果

30歳未満の人々:
    Name  Age     City
0  Alice   25 New York
3  David   28  Chicago
4    Eve   22   Boston

30歳未満のニューヨーク在住者:
    Name  Age      City
0  Alice   25  New York

この例では、条件式を使用して特定の条件を満たす行を抽出しています。

複数の条件を組み合わせる場合は、&(AND)や|(OR)演算子を使用します。

○サンプルコード7:特定の列を抽出

DataFrameから特定の列を抽出するのは、特定の行を抽出するよりも簡単です。

列名を指定するだけで、その列のデータを取得できます。

# 単一の列を抽出
names = df['Name']
print("名前の列:")
print(names)

# 複数の列を抽出
name_and_age = df[['Name', 'Age']]
print("\n名前と年齢の列:")
print(name_and_age)

実行結果

名前の列:
0      Alice
1        Bob
2    Charlie
3      David
4        Eve
Name: Name, dtype: object

名前と年齢の列:
     Name  Age
0   Alice   25
1     Bob   30
2 Charlie   35
3   David   28
4     Eve   22

単一の列を抽出する場合は列名を文字列で指定し、複数の列を抽出する場合は列名のリストを使用します。

○サンプルコード8:条件を満たすデータを抽出

実際のデータ分析では、特定の条件を満たすデータだけを抽出したい場合がよくあります。

pandasでは、条件式を使用してデータをフィルタリングすることができます。

# 年齢が30歳以上の人のデータを抽出
older_people = df[df['Age'] >= 30]
print("30歳以上の人々:")
print(older_people)

# 複数の条件を組み合わせてデータを抽出
sf_or_la = df[(df['City'] == 'San Francisco') | (df['City'] == 'Los Angeles')]
print("\nサンフランシスコまたはロサンゼルス在住者:")
print(sf_or_la)

実行結果

30歳以上の人々:
     Name  Age           City
1     Bob   30  San Francisco
2 Charlie   35    Los Angeles

サンフランシスコまたはロサンゼルス在住者:
     Name  Age           City
1     Bob   30  San Francisco
2 Charlie   35    Los Angeles

このように、条件式を使用することで、複雑な条件に基づいてデータを抽出することができます。

&演算子を使用してAND条件を、|演算子を使用してOR条件を表現できます。

●DataFrameの削除と初期化

データ分析や機械学習のプロジェクトを進める中で、不要なデータを削除したり、DataFrameを初期化したりする場面に遭遇することがあります。

例えば、データクリーニングの過程で特定の行や列を削除したい場合や、新しい分析を始めるためにDataFrameをリセットしたい場合などです。

ここでは、PandasライブラリによるDataFrameの削除と初期化の方法を詳しく見ていきましょう。

○サンプルコード9:不要な行・列の削除

データ分析の過程で、特定の行や列が不要だと判断することがあります。

例えば、欠損値が多すぎる列や、分析に関係のない情報を含む行などです。

Pandasでは、dropメソッドを使用して簡単に行や列を削除できます。

まずは、行の削除から見ていきましょう。

import pandas as pd

# サンプルのDataFrameを作成
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 30, 35, 28, 22],
    'City': ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Boston'],
    'Salary': [50000, 60000, 70000, 55000, 45000]
})

print("元のDataFrame:")
print(df)

# インデックスを指定して行を削除
df_dropped_rows = df.drop([1, 3])

print("\n1行目と3行目を削除したDataFrame:")
print(df_dropped_rows)

実行結果:

元のDataFrame:
     Name  Age           City  Salary
0   Alice   25       New York   50000
1     Bob   30  San Francisco   60000
2 Charlie   35    Los Angeles   70000
3   David   28        Chicago   55000
4     Eve   22         Boston   45000

1行目と3行目を削除したDataFrame:
     Name  Age           City  Salary
0   Alice   25       New York   50000
2 Charlie   35    Los Angeles   70000
4     Eve   22         Boston   45000

このコードでは、dropメソッドを使用して特定の行を削除しています。

削除したい行のインデックスをリストで指定します。

デフォルトでは新しいDataFrameを返すため、元のDataFrameは変更されません。

次に、列の削除を見てみましょう。

# 列を削除
df_dropped_columns = df.drop(['Age', 'Salary'], axis=1)

print("\n'Age'列と'Salary'列を削除したDataFrame:")
print(df_dropped_columns)

実行結果

'Age'列と'Salary'列を削除したDataFrame:
     Name           City
0   Alice       New York
1     Bob  San Francisco
2 Charlie    Los Angeles
3   David        Chicago
4     Eve         Boston

列を削除する場合は、dropメソッドのaxisパラメータに1を指定します。

削除したい列名をリストで指定します。

条件に基づいて行を削除することもできます。

例えば、特定の値を含む行を削除する場合は次のようにします。

# 条件に基づいて行を削除(年齢が30未満の行を削除)
df_filtered = df[df['Age'] >= 30]

print("\n年齢が30以上の行のみを残したDataFrame:")
print(df_filtered)

実行結果

年齢が30以上の行のみを残したDataFrame:
     Name  Age           City  Salary
1     Bob   30  San Francisco   60000
2 Charlie   35    Los Angeles   70000

この方法では、条件式を使用してデータをフィルタリングしています。

結果として、条件を満たさない行が削除されたような効果が得られます。

○サンプルコード10:DataFrameの初期化

新しい分析を始める際や、大規模なデータ処理の後にメモリを解放する際には、DataFrameを初期化する必要があります。

Pandasでは、空のDataFrameを作成したり、既存のDataFrameをクリアしたりする方法がいくつかあります。

まず、完全に新しい空のDataFrameを作成する方法を見てみましょう。

# 空のDataFrameを作成
empty_df = pd.DataFrame()

print("新しい空のDataFrame:")
print(empty_df)

# 列名だけを指定して空のDataFrameを作成
empty_df_with_columns = pd.DataFrame(columns=['Name', 'Age', 'City'])

print("\n列名を指定した空のDataFrame:")
print(empty_df_with_columns)

実行結果

新しい空のDataFrame:
Empty DataFrame
Columns: []
Index: []

列名を指定した空のDataFrame:
Empty DataFrame
Columns: [Name, Age, City]
Index: []

このコードでは、完全に空のDataFrameと、列名だけを指定した空のDataFrameを作成しています。

後者は、データ構造を事前に定義しておきたい場合に便利です。

既存のDataFrameをクリアする場合は、いくつかの方法があります。

# 既存のDataFrameの全ての行を削除
df_cleared = df.drop(df.index)

print("全ての行を削除したDataFrame:")
print(df_cleared)

# DataFrameを空のDataFrameで上書き
df = pd.DataFrame()

print("\nDataFrameを空のDataFrameで上書きした結果:")
print(df)

実行結果

全ての行を削除したDataFrame:
Empty DataFrame
Columns: [Name, Age, City, Salary]
Index: []

DataFrameを空のDataFrameで上書きした結果:
Empty DataFrame
Columns: []
Index: []

1つ目の方法では、dropメソッドを使用して全ての行を削除しています。

この方法では列構造は保持されます。

2つ目の方法では、変数を完全に新しい空のDataFrameで上書きしています。

●DataFrameを使いこなすコツ

DataFrameの基本的な操作方法を習得したら、次はより効率的かつ効果的にDataFrameを扱うためのコツを学びましょう。

大規模なデータセットを扱う際や、リソースが限られた環境で作業する場合、これらのコツは非常に重要になります。

ここでは、メモリ使用量の管理、大規模データの処理方法、適切なデータ型の選択について詳しく見ていきます。

○メモリ使用量に注意

DataFrameを扱う際、特に大規模なデータセットを扱う場合、メモリ使用量に注意を払う必要があります。

メモリを効率的に使用することで、処理速度の向上やシステムの安定性を確保できます。

メモリ使用量を削減する一つの方法は、不要な列を削除することです。

例えば、分析に使用しない列がある場合、それらを削除することでメモリを節約できます。

import pandas as pd
import numpy as np

# 大きなDataFrameを作成
df = pd.DataFrame(np.random.randn(100000, 5), columns=['A', 'B', 'C', 'D', 'E'])

# メモリ使用量を確認
print(f"元のDataFrameのメモリ使用量: {df.memory_usage().sum() / 1e6:.2f} MB")

# 不要な列を削除
df_reduced = df.drop(['D', 'E'], axis=1)

# 削除後のメモリ使用量を確認
print(f"列削除後のDataFrameのメモリ使用量: {df_reduced.memory_usage().sum() / 1e6:.2f} MB")

実行結果

元のDataFrameのメモリ使用量: 4.00 MB
列削除後のDataFrameのメモリ使用量: 2.40 MB

このコードでは、まず大きなDataFrameを作成し、その後不要な列を削除しています。

memory_usage()メソッドを使用して、操作前後のメモリ使用量を確認しています。

結果を見ると、2つの列を削除することで、メモリ使用量が大幅に減少していることがわかります。

また、データ型の最適化もメモリ使用量削減に効果的です。

例えば、整数データに対して必要以上に大きなデータ型を使用していないか確認し、適切な型に変換することでメモリを節約できます。

# データ型の最適化
df_optimized = df_reduced.copy()
df_optimized['A'] = df_optimized['A'].astype('float32')
df_optimized['B'] = df_optimized['B'].astype('float32')

print(f"データ型最適化後のDataFrameのメモリ使用量: {df_optimized.memory_usage().sum() / 1e6:.2f} MB")

実行結果

データ型最適化後のDataFrameのメモリ使用量: 1.60 MB

この例では、’float64’型だった列を’float32’型に変換しています。

結果として、メモリ使用量がさらに削減されていることがわかります。

○大規模データは分割処理

大規模なデータセットを扱う際、全てのデータを一度にメモリに読み込むことが難しい場合があります。

そのような場合、データを小さな塊に分割して処理する方法が効果的です。

Pandasのread_csv()関数にはchunksizeパラメータがあり、これを使用することで大きなCSVファイルを小さな塊に分けて読み込むことができます。

import pandas as pd

# 大きなCSVファイルを分割して読み込む
chunk_size = 1000
result = pd.DataFrame()

for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    # 各塊に対して処理を行う
    processed_chunk = chunk.groupby('category')['value'].mean()
    result = result.append(processed_chunk)

# 結果を集計
final_result = result.groupby(result.index).mean()
print(final_result)

このコードでは、大きなCSVファイルを1000行ずつ読み込み、各塊に対して処理(この例ではカテゴリごとの平均値の計算)を行っています。

最後に、全ての結果を集計しています。

大規模データの分割処理は、メモリ使用量を抑えるだけでなく、処理の進捗状況を把握しやすくなるメリットもあります。

長時間の処理が必要な場合、各塊の処理が終わるごとに進捗を表示することで、全体の進行状況を確認できます。

○適切な型を使う

DataFrameで適切なデータ型を使用することは、メモリ効率と処理速度の両方を向上させる上で重要です。

Pandasには様々なデータ型がありますが、代表的なものとしては整数型(int64, int32など)、浮動小数点型(float64, float32など)、文字列型(object)、カテゴリ型(category)などがあります。

特に、カテゴリデータを扱う際はcategory型の使用を検討しましょう。

category型は、特定の値の集合を持つデータに対して効率的なメモリ使用と高速な処理を提供します。

import pandas as pd
import numpy as np

# サンプルDataFrameを作成
df = pd.DataFrame({
    'id': np.arange(1000000),
    'category': np.random.choice(['A', 'B', 'C', 'D'], 1000000)
})

print(f"元のDataFrameのメモリ使用量: {df.memory_usage().sum() / 1e6:.2f} MB")

# category列をcategory型に変換
df['category'] = df['category'].astype('category')

print(f"category型変換後のDataFrameのメモリ使用量: {df.memory_usage().sum() / 1e6:.2f} MB")

実行結果:

元のDataFrameのメモリ使用量: 16.00 MB
category型変換後のDataFrameのメモリ使用量: 8.00 MB

この例では、category列をobject型からcategory型に変換することで、メモリ使用量が大幅に削減されています。

特に、カテゴリの種類が少なく、データ量が多い場合にこの効果は顕著になります。

まとめ

PythonのDataFrameは、データ分析や機械学習の分野で欠かせない存在です。

この記事では、DataFrameの基本的な使い方から応用テクニックまで、幅広く解説してきました。

この記事で学んだ内容を実際のデータセットに適用し、練習を重ねることで、より深い理解と実践的なスキルを身につけることができるでしょう。

DataFrameの基本をしっかりと押さえた上で、さらなる高みを目指して学習を続けていってください。