Pandas データソート

PandasBeginner
オンラインで実践に進む

はじめに

Pandas でのデータソートの実験へようこそ!ソートはデータ分析における基本的な操作です。データを整理し、読みやすく、理解しやすく、分析しやすくするのに役立ちます。最高値または最低値を見つける必要がある場合でも、単にデータを論理的な順序で並べたい場合でも、Pandas はタスクを完了するための強力で柔軟なツールを提供します。

この実験では、Pandas の主要なソート方法を学びます。

  • sort_values(): 1 つ以上の列の値で DataFrame をソートします。
  • sort_index(): インデックスで DataFrame をソートします。
  • reset_index(): ソート操作後にインデックスをリセットします。

この実験が終わる頃には、分析ニーズに合わせてデータを並べ替えることができるようになります。始めましょう!

sort_values を使用して単一列で DataFrame をソートする

このステップでは、最も一般的なソート操作である、単一の列の値に基づいて DataFrame をソートする方法を学びます。これには sort_values() メソッドを使用します。by パラメータは、ソートしたい列を指定するために使用されます。

まず、左側のファイルエクスプローラーを使用して、~/project ディレクトリにある main.py ファイルを開きます。このファイルには、サンプル DataFrame が事前に入力されています。

次に、Age 列で DataFrame をソートするために、以下のコードを main.py の末尾に追加します。

## --- ステップ 1: 単一の列でソート ---
df_sorted_by_age = df.sort_values(by='Age')
print("\nDataFrame sorted by Age:")
print(df_sorted_by_age)

これで、完全な main.py ファイルは次のようになります。

import pandas as pd

## 演習用のサンプル DataFrame を作成します
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 22, 25, 28, 22],
    'Score': [85, 91, 88, 79, 91]
}
df = pd.DataFrame(data)

print("Original DataFrame:")
print(df)

## --- ステップ 1: 単一の列でソート ---
df_sorted_by_age = df.sort_values(by='Age')
print("\nDataFrame sorted by Age:")
print(df_sorted_by_age)

結果を確認するには、ターミナルからスクリプトを実行します。

python3 main.py

元の DataFrame の後に、年齢で昇順にソートされた新しい DataFrame が表示されます。

期待される出力:

Original DataFrame:
      Name  Age  Score
0    Alice   25     85
1      Bob   22     91
2  Charlie   25     88
3    David   28     79
4      Eve   22     91

DataFrame sorted by Age:
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
0    Alice   25     85
2  Charlie   25     88
3    David   28     79

複数列を昇順でソートする

このステップでは、複数の列に基づいて DataFrame をソートする方法を学びます。これは、最初のソート列に同順位があり、二次的なソート基準を適用したい場合に役立ちます。

複数の列でソートするには、sort_values() メソッドの by パラメータに列名のリストを渡します。Pandas はリストの最初の列でソートし、次に 2 番目の列を使用して同順位を解消します。

DataFrame をまず Age で、次に Score でソートしてみましょう。以下のコードを main.py ファイルの末尾に追加します。

## --- ステップ 2: 複数の列でソート ---
df_sorted_multiple = df.sort_values(by=['Age', 'Score'])
print("\nDataFrame sorted by Age and then Score:")
print(df_sorted_multiple)

これで、スクリプトを再度実行して変更を確認します。

python3 main.py

出力に新しいセクションが表示されます。Age が 22 の 2 行が Score でソートされていることに注意してください(Eve の 91 の後に Bob の 91 が来るのは、その順序が安定しているためです)。Age が 25 の行にも同様のことが適用されます。

期待される出力(新しい部分のみ表示):

...

DataFrame sorted by Age and then Score:
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
0    Alice   25     85
2  Charlie   25     88
3    David   28     79

ascending=False で降順ソートする

このステップでは、ソート方向を制御する方法を学びます。デフォルトでは、sort_values() は昇順にソートします。これを変更するには、ascending パラメータを使用します。

  • 降順にソートするには、ascending=False を設定します。
  • 複数の列でソートする場合、各列に異なる順序を指定するには、ブール値のリストを渡します。例:ascending=[True, False]

DataFrame をまず Age で昇順に、次に Score で降順にソートしてみましょう。これにより、各年齢グループ内で最もスコアの高い人を見つけるのに役立ちます。以下のコードを main.py の末尾に追加します。

## --- ステップ 3: 降順および混合順序でソート ---
df_sorted_mixed = df.sort_values(by=['Age', 'Score'], ascending=[True, False])
print("\nDataFrame sorted by Age (asc) and Score (desc):")
print(df_sorted_mixed)

スクリプトを実行して結果を観察します。

python3 main.py

出力で、年齢 22 の行を見てください。Eve と Bob は両方ともスコアが 91 なので、順序が変わらない場合があります。年齢 25 の場合、スコアを降順にソートしたため、Charlie (スコア 88) が Alice (スコア 85) の前に表示されるようになりました。

期待される出力(新しい部分のみ表示):

...

DataFrame sorted by Age (asc) and Score (desc):
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
2  Charlie   25     88
0    Alice   25     85
3    David   28     79

sort_index を使用してインデックスをソートする

このステップでは、DataFrame をインデックスでソートする方法を学びます。sort_values() 操作を実行した後、DataFrame のインデックスはシャッフルされます。これは前の出力で確認できます(例:インデックスは 1, 4, 2, 0, 3 です)。

sort_index() メソッドを使用すると、インデックスラベルに基づいて DataFrame をソートでき、インデックスが単純な範囲であった場合は元の順序を復元できます。

前のステップの結果(df_sorted_mixed)を取得し、インデックスでソートしてみましょう。以下のコードを main.py の末尾に追加します。

## --- ステップ 4: インデックスでソート ---
## 前の結果 (df_sorted_mixed) はインデックスがバラバラになっています。インデックスでソートしましょう。
df_reordered_by_index = df_sorted_mixed.sort_index()
print("\nDataFrame re-sorted by index:")
print(df_reordered_by_index)

スクリプトを実行します。

python3 main.py

DataFrame がインデックス(0、1、2、3、4)でソートされ、事実上元の行順序が復元されていることがわかります。

期待される出力(新しい部分のみ表示):

...

DataFrame re-sorted by index:
      Name  Age  Score
0    Alice   25     85
1      Bob   22     91
2  Charlie   25     88
3    David   28     79
4      Eve   22     91

reset_index でソート後にインデックスをリセットする

この最終ステップでは、DataFrame のインデックスをリセットする方法を学びます。ソート後、インデックスは 0 から始まるクリーンな連続した範囲ではなくなります。sort_index() は元の順序を復元できますが、新しいソート順序を維持しつつ、新しく連続したインデックスを持たせたい場合があります。

reset_index() メソッドはこれに最適です。現在のインデックスをデフォルトの整数インデックス(0、1、2、...)に置き換えます。古いインデックスを完全に破棄するために drop=True パラメータを使用するのが一般的です。drop=True を使用しない場合、古いインデックスは index という名前の新しい列として追加されます。

ソート済みの DataFrame の一つ(df_sorted_mixed)を取得し、そのインデックスをリセットしてみましょう。最後のコード片を main.py に追加します。

## --- ステップ 5: ソート後にインデックスをリセット ---
## ソート済みの DataFrame を取得し、新しくクリーンなインデックスを付けましょう
df_with_reset_index = df_sorted_mixed.reset_index(drop=True)
print("\nSorted DataFrame with reset index:")
print(df_with_reset_index)

最後にスクリプトを実行します。

python3 main.py

最終的な出力を観察します。DataFrame は引き続き Age(昇順)と Score(降順)でソートされていますが、インデックスは 0 から 4 までのクリーンなシーケンスになっています。

期待される出力(新しい部分のみ表示):

...

Sorted DataFrame with reset index:
      Name  Age  Score
0      Bob   22     91
1      Eve   22     91
2  Charlie   25     88
3    Alice   25     85
4    David   28     79

まとめ

Pandas Sorting Data の実験を完了おめでとうございます!Pandas DataFrame 内のデータを整理および順序付けするための基本的なスキルを習得しました。

この実験では、以下のことを練習しました。

  • sort_values(by='column_name') を使用した単一列でのソート。
  • by パラメータにリストを渡すことによる複数列でのソート。
  • ascending パラメータを使用したソート方向の制御。
  • sort_index() を使用したインデックスのソートによる元の順序の復元。
  • reset_index(drop=True) を使用したソート済み DataFrame の新しいクリーンなインデックスの作成。

これらのソート技術は、データクリーニング、探索、およびより高度な分析や可視化の準備のための基本となります。これらのスキルを引き続き練習し、データサイエンスの旅をより効率的に進めてください。