Pandas df.sort_values() 関数

Pandas 常用函数Pandas のよく使う関数


df.sort_values()は、Pandas において DataFrame のデータを1つまたは複数の列に従ってソートするための関数です。

ソートはデータ分析の基本操作であり、データをよりよく理解し、法則を見つけるのに役立ちます。sort_values()単一列または複数列でのソート、昇順または降順でのソートに対応し、欠損値も処理できる、データ処理に欠かせないツールです。


基本構文とパラメータ

sort_values()DataFrame のメンバー関数であり、ドット演算子によって.呼び出します。

構文形式

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)

パラメータの説明

パラメータ 型 必須かどうか 説明 デフォルト値
by str または str のリスト 必須 ソートに使用する列名を指定します。リストの場合は、リスト内の順序に従って順番にソートします。 无
axis int または str 任意 ソートする軸を指定します。0 或 'index'列方向にソートすることを示します(デフォルト)。1 或 'columns'行方向にソートすることを示します。 0
ascending bool または bool のリスト 任意 ソート順序を指定します。True昇順(小さいものから大きいものへ)を示します。False降順(大きいものから小さいものへ)を示します。リストの場合は、by内の列と1対1で対応します。 True
inplace bool 任意 もしTrueの場合は、元の DataFrame 上で直接変更され、新しいオブジェクトは返されません。もしFalseの場合は、新しい DataFrame が返され、元のデータは変更されません。 False
kind str 任意 ソートアルゴリズムを指定します。'quicksort'(クイックソート)、'mergesort'(マージソート)、'heapsort'(ヒープソート)、'stable'(安定ソート)。 'quicksort'
na_position str 任意 欠損値(NaN)の位置を指定します。'first'先頭に置くことを示します。'last'最後に置くことを示します。 'last'
ignore_index bool 任意 もしTrueの場合は、ソート後のインデックスをリセットし、0から番号を付け直します。もしFalseの場合は、元のインデックスを保持します。 False
key callable 任意 ソート前にデータに関数を適用します。カスタムソートルールを定義するためによく使われます。 None

戻り値の説明

  • 新しい DataFrame を返します(inplace=Falseの場合)。または、None(もしinplace=True)。
  • 返される DataFrame のデータは指定された規則に従ってソートされています。

例

一連の例を通して、sort_values()の使い方を徹底的に理解しましょう。

例1:単一列の昇順ソート

最も簡単な使い方は、特定の列の値で昇順にソートすることです。

例

import pandas as pd

# 创建一个学生成绩 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '数学': [85, 92, 78, 90, 88],
    '英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 按数学成绩升序排序
df_sorted = df.sort_values(by='数学')

print("按数学成绩升序排序后:")
print(df_sorted)

期待される実行結果:

原始数据:
   姓名  数学  英语
0  张三   85   90
1  李四   92   85
2  王五   78   92
3  赵六   90   88
4  钱七   88   78
==================================================
按数学成绩升序排序后:
   姓名  数学  英语
2  王五   78   92
0  张三   85   90
4  钱七   88   78
3  赵六   90   88
1  李四   92   85

コードの解説:

  1. デフォルトのソート順は昇順(小さいものから大きいものへ)です。
  2. 数学の成績 78 点が先頭、92 点が最後に並びます。
  3. ソート後もインデックスは保持されます(2, 0, 4, 3, 1)。

例2:単一列の降順ソート

を使用するとascending=False降順ソートを実現できます。

例

import pandas as pd

# 创建一个学生成绩 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '数学': [85, 92, 78, 90, 88],
    '英语': [90, 85, 92, 88, 78]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 按数学成绩降序排序
df_sorted = df.sort_values(by='数学', ascending=False)

print("按数学成绩降序排序后:")
print(df_sorted)

期待される実行結果:

原始数据:
   姓名  数学  英语
0  张三   85   90
1  李四   92   85
2  王五   78   92
3  赵六   90   88
4  钱七   88   78
==================================================
按数学成绩降序排序后:
   姓名  数学  英语
1  李四   92   85
3  赵六   90   88
4  钱七   88   78
0  张三   85   90
2  王五   78   92

コードの解説:

  • を使用するとascending=False大きいものから小さいものへの降順ソートができます。
  • 李四の数学の成績 92 点が先頭に並びます。

例3:複数列によるソート

複数の列に基づいてソートできます。最初の列でソートし、最初の列が同じ場合は2番目の列でソートします。

例

import pandas as pd

# 创建一个学生成绩 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '班级': ['一班', '二班', '一班', '二班', '一班'],
    '数学': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# まずクラス順に並べ、次に数学の成績順に並べます(いずれも昇順)
df_sorted = df.sort_values(by=['班级', '数学'])

print("先按班级,再按数学成绩排序后:")
print(df_sorted)
print("=" * 50)

# 按班级升序,数学成绩降序
df_sorted2 = df.sort_values(by=['班级', '数学'], ascending=[True, False])

print("按班级升序,数学成绩降序:")
print(df_sorted2)

期待される実行結果:

原始数据:
   姓名  班级  数学
0  张三  一班   85
1  李四  二班   92
2  王五  一班   78
3  赵六  二班   90
4  钱七  一班   88
==================================================
先按班级,再按数学成绩排序后:
   姓名  班级  数学
2  王五  一班   78
0  张三  一班   85
4  钱七  一班   88
3  赵六  二班   90
1  李四  二班   92
==================================================
按班级升序,数学成绩降序:
   姓名  班级  数学
4  钱七  一班   88
0  张三  一班   85
2  王五  一班   78
1  李四  二班   92
3  赵六  二班   90

コードの解説:

  • リストを使用するとby=['班级', '数学']複数列でのソートができます。
  • まず「班级」でソートし、一班が先頭、二班が後ろになります。
  • 同じクラス内では、さらに「数学」の成績でソートされます。
  • を使用するとascending=[True, False]列ごとに異なるソート方向を指定できます。

例4:欠損値を扱うソート

を使用するとna_positionパラメータで欠損値の位置を制御できます。

例

import pandas as pd
import numpy as np

# 欠損値を含むDataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# デフォルト:欠損値は最後に置く
df_sorted_last = df.sort_values(by='成绩')

print("欠損値を最後に置く:")
print(df_sorted_last)
print("=" * 50)

# 欠損値を先頭に配置
df_sorted_first = df.sort_values(by='成绩', na_position='first')

print("欠損値を先頭に置く:")
print(df_sorted_first)

期待される実行結果:

原始数据:
   姓名   成绩
0  张三  85.0
1  李四   NaN
2  王五  92.0
3  赵六  78.0
==================================================
缺失值放在最后:
   姓名   成绩
3  赵六  78.0
0  张三  85.0
2  王五  92.0
1  李四   NaN
==================================================
缺失值放在最前:
   姓名   成绩
1  李四   NaN
3  赵六  78.0
0  张三  85.0
2  王五  92.0

コードの解説:

  • デフォルトでは(na_position='last')、欠損値は最後に配置されます。
  • 設定na_position='first'すると、欠損値が先頭に配置されます。

例5:ソート後のインデックスのリセット

ソート後はインデックスが連続しなくなることがあります。ignore_index=Trueを使用してインデックスをリセットできます。

例

import pandas as pd

# 创建一个 DataFrame
data = {
    '姓名': ['张三', '李四', '王五'],
    '成绩': [85, 92, 78]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 排序但不重置索引
df_sorted = df.sort_values(by='成绩')

print("排序后(保留原始索引):")
print(df_sorted)
print("=" * 50)

# 排序并重置索引
df_sorted_reset = df.sort_values(by='成绩', ignore_index=True)

print(ソート後(インデックス再設定):)
print(df_sorted_reset)

実行結果の予想:

原始数据:
   姓名  成绩
0  张三   85
1  李四   92
2  王五   78
==================================================
排序后(保留原始索引):
   姓名  成绩
2  王五   78
0  张三   85
1  李四   92
==================================================
排序后(重置索引):
   姓名  成绩
0  王五   78
1  张三   85
2  李四   92

コードの解説:

  • 使用ignore_index=True後、インデックスは再び0から番号が付けられます。
  • これは、後でインデックスでデータにアクセスする必要がある場合に便利です。

例6:key パラメータを使ったカスタムソート

keyパラメータを使用すると、ソート前にデータにカスタム関数を適用できます。

例

import pandas as pd

大文字と小文字が混在する文字列 DataFrame を作成する
data = {
    '单词': ['apple', 'Banana', 'cherry', 'APPLE', 'banana']
}
df = pd.DataFrame(data)

print(元のデータ:)
print(df)
print("=" * 50)

# アルファベット昇順でソート(大文字小文字を区別)
df_sorted_case = df.sort_values(by='单词')

print(アルファベット昇順(大文字小文字を区別):)
print(df_sorted_case)
print("=" * 50)

# key パラメータを使用して大文字小文字を区別しないソートを実装する
df_sorted_nocase = df.sort_values(by='单词', key=lambda x: x.str.lower())

print(アルファベット昇順(大文字小文字を区別しない):)
print(df_sorted_nocase)

実行結果の予想:

原始数据:
    单词
0  apple
1  Banana
2  cherry
3  APPLE
4  banana
==================================================
按字母升序(区分大小写):
    单词
3  APPLE
0  apple
1  Banana
4  banana
2  cherry
==================================================
按字母升序(不区分大小写):
    单词
0  apple
3  APPLE
1  Banana
4  banana
2  cherry

コードの解説:

  • デフォルトのソートでは大文字と小文字が区別され、大文字は小文字の前に並びます。
  • を使用して、key=lambda x: x.str.lower()すべての文字列を小文字に変換してからソートすることで、大文字小文字を区別しないソートを実現します。

例7:inplace パラメータによるインプレース変更

を使用すると、inplace=True元のDataFrame上で直接変更できます。

例

import pandas as pd

# DataFrame を作成する
data = {
    '姓名': ['张三', '李四', '王五'],
    '成绩': [85, 92, 78]
}
df = pd.DataFrame(data)

print(元のデータ:)
print(df)
print(f元のデータ id: {id(df)})
print("=" * 50)

# inplace=True を使用してその場でソートする
df.sort_values(by='成绩', inplace=True)

print(inplace=True でソート後:)
print(df)
print(fソート後のデータ id: {id(df)})

実行結果の予想:

原始数据:
   姓名  成绩
0  张三   85
1  李四   92
2  王五   78
原始数据 id: 140234567890
==================================================
使用 inplace=True 排序后:
   姓名  成绩
2  王五   78
0  张三   85
1  李四   92
排序后数据 id: 140234567890  # 同一个对象

コードの解説:

  • 使用inplace=True後、DataFrame 自体が変更され、新しいオブジェクトは返されません。
  • ソート前後のidが同じで、同じオブジェクトであることがわかります。
  • この方法はメモリを節約できますが、元のデータを変更します。

注意事項

  • sort_values()デフォルトでは新しいDataFrameが返され、元のデータは変更されません。その場で変更したい場合は、inplace=Trueパラメータを使用してください。
  • ソート操作はその場では行われません(指定しない限りinplace=True)。元のDataFrameは変更されません。
  • を使用すると、ignore_index=Trueインデックスを再設定でき、後続のデータ処理でより便利になります。
  • keyパラメータは非常に強力で、大文字小文字を区別しない、絶対値によるソートなど、さまざまなカスタムソートを実現できます。
  • 複数列でソートする場合、ascendingパラメータはリストにでき、DataFrameby中の列と一対一に対応します。

Pandas 常用函数Pandas よく使う関数

その他の拡張