Pandas df.sort_values() 関数
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)
# 创建一个学生成绩 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
コードの解説:
- デフォルトのソート順は昇順(小さいものから大きいものへ)です。
- 数学の成績 78 点が先頭、92 点が最後に並びます。
- ソート後もインデックスは保持されます(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)
# 创建一个学生成绩 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)
# 创建一个学生成绩 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)
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)
# 创建一个 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)
大文字と小文字が混在する文字列 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)})
# 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 のよく使う関数