Pandas df.reset_index() 関数
df.reset_index()Pandas で DataFrame の行インデックスをリセットするための関数です。
データ処理の過程で、インデックスが不連続になったり、ニーズに合わなくなったりすることがあります。reset_index()インデックスをデフォルトの整数インデックス(0, 1, 2, ...)にリセットするか、現在のインデックスを列に変換することができます。これはデータクリーニング、並べ替え、フィルタリング後のデータ整理に非常に役立ちます。
基本構文とパラメータ
reset_index()DataFrame のメンバー関数であり、ドット演算子を使用して.呼び出します。
構文形式
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| level | int、str、tuple または list | オプション | リセットするインデックスレベルを指定します。マルチインデックス(MultiIndex)の場合、その一部のレベルを選択してリセットできます。デフォルトではすべてのレベルをリセットします。 | None |
| drop | bool | オプション | の場合True、元のインデックスを破棄し、列に変換しません。の場合False、元のインデックスを新しい列として保持します。 |
False |
| inplace | bool | オプション | の場合True、元の DataFrame 上で直接変更し、新しいオブジェクトを返しません。の場合False、新しい DataFrame を返し、元のデータは変更されません。 |
False |
| col_level | int または str | オプション | 列名がマルチインデックスの場合、インデックスをどのレベルに挿入するかを指定します。 | 0 |
| col_fill | str | オプション | 列名がマルチインデックスの場合、元のインデックスが列に変換されるときに、他のレベルの列名を埋めるために使用します。 | '' |
戻り値の説明
- 新しい DataFrame を返します(もし
inplace=False)、またはNone(もしinplace=True)。 - )
drop=False返される DataFrame ではインデックスがリセットされ、元のインデックス(もし
例
例reset_index()一連の例を通して、徹底的に
例1:基本的な使い方 - インデックスのリセット
最も一般的な使い方は、インデックスをデフォルトの整数インデックスにリセットすることです。
例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据(默认索引):")
print(df)
print("=" * 50)
# データをソートして、インデックスが不連続になる
df_sorted = df.sort_values(by='成绩', ascending=False)
print("ソート後のデータ(インデックスが連続していない):")
print(df_sorted)
print("=" * 50)
# 重置索引
df_reset = df_sorted.reset_index()
print("重置索引后:")
print(df_reset)
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据(默认索引):")
print(df)
print("=" * 50)
# データをソートして、インデックスが不連続になる
df_sorted = df.sort_values(by='成绩', ascending=False)
print("ソート後のデータ(インデックスが連続していない):")
print(df_sorted)
print("=" * 50)
# 重置索引
df_reset = df_sorted.reset_index()
print("重置索引后:")
print(df_reset)
実行結果の予想:
原始数据(默认索引): 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 ================================================== 排序后的数据(索引不连续): 姓名 成绩 1 李四 92 0 张三 85 2 王五 78 ================================================== 重置索引后: 姓名 成绩 index 0 李四 92 1 # 原来的索引作为新列 1 张三 85 0 2 王五 78 2
コードの解説:
- 並べ替え後、インデックスは 1、0、2 となり、連続した 0、1、2 ではなくなりました。
- 使用して
reset_index()後、インデックスは 0、1、2 にリセットされます。 - 元のインデックスは新しい列 "index" として保持されます。
例2:drop パラメータを使用して元のインデックスを破棄する
元のインデックスを保持する必要がない場合は、drop=Trueパラメータを使用できます。
例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# データをソートする
df_sorted = df.sort_values(by='成绩', ascending=False)
print("ソート後のデータ:")
print(df_sorted)
print("=" * 50)
# 重置索引,丢弃原索引
df_reset = df_sorted.reset_index(drop=True)
print("重置索引(丢弃原索引)后:")
print(df_reset)
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# データをソートする
df_sorted = df.sort_values(by='成绩', ascending=False)
print("ソート後のデータ:")
print(df_sorted)
print("=" * 50)
# 重置索引,丢弃原索引
df_reset = df_sorted.reset_index(drop=True)
print("重置索引(丢弃原索引)后:")
print(df_reset)
実行結果の予想:
排序后的数据: 姓名 成绩 1 李四 92 0 张三 85 2 王五 78 ================================================== 重置索引(丢弃原索引)后: 姓名 成绩 0 李四 92 1 张三 85 2 王五 78
コードの解説:
- 使用して
drop=True後、元のインデックスは直接破棄され、新しい列として保持されません。 - これは、元のインデックス情報を保持する必要がない場合に役立ちます。
例3:データをフィルタリングした後にインデックスをリセットする
データをフィルタリングした後、インデックスが不連続になる場合があります。reset_index()使用してデータを整理できます。
例
import pandas as pd
import numpy as np
# すべての学生の成績を含むDataFrameを作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'成绩': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 成績が85点を超える学生を抽出
df_filtered = df[df['成绩'] > 85]
print("フィルタリング後のデータ(インデックスが連続していない):")
print(df_filtered)
print("=" * 50)
# 重置索引
df_reset = df_filtered.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# すべての学生の成績を含むDataFrameを作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'成绩': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 成績が85点を超える学生を抽出
df_filtered = df[df['成绩'] > 85]
print("フィルタリング後のデータ(インデックスが連続していない):")
print(df_filtered)
print("=" * 50)
# 重置索引
df_reset = df_filtered.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
実行結果の予想:
原始数据: 姓名 成绩 0 张三 85 1 李四 92 2 王五 78 3 赵六 90 4 钱七 88 ================================================== 筛选后的数据(索引不连续): 姓名 成绩 1 李四 92 3 赵六 90 4 钱七 88
コードの解説:
- フィルタリング後に保持されるのは元のインデックス 1、3、4 であり、連続した 0、1、2 ではありません。
- 使用して
reset_index(drop=True)連続したインデックスを得られ、後続の処理がより容易になります。
例4:重複行を削除した後にインデックスをリセットする
重複データを削除した後も、reset_index()使用してインデックスを整理できます。
例
import pandas as pd
import numpy as np
# 重複行を含むDataFrameを作成する
data = {
'姓名': ['张三', '李四', '张三', '王五'],
'城市': ['北京', '上海', '北京', '广州']
}
df = pd.DataFrame(data)
print("原始数据(包含重复行):")
print(df)
print("=" * 50)
# 删除重复行
df_unique = df.drop_duplicates()
print("删除重复行后(索引不连续):")
print(df_unique)
print("=" * 50)
# 重置索引
df_reset = df_unique.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# 重複行を含むDataFrameを作成する
data = {
'姓名': ['张三', '李四', '张三', '王五'],
'城市': ['北京', '上海', '北京', '广州']
}
df = pd.DataFrame(data)
print("原始数据(包含重复行):")
print(df)
print("=" * 50)
# 删除重复行
df_unique = df.drop_duplicates()
print("删除重复行后(索引不连续):")
print(df_unique)
print("=" * 50)
# 重置索引
df_reset = df_unique.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
実行結果の予想:
原始数据(包含重复行): 姓名 城市 0 张三 北京 1 李四 上海 2 张三 北京 # 重复 3 王五 广州 ================================================== 删除重复行后(索引不连续): 姓名 城市 0 张三 北京 1 李四 上海 3 王五 广州
コードの解説:
- 重複行を削除した後、保持されるインデックスは 0、1、3 であり、連続した 0、1、2 ではありません。
- インデックスをリセットすると、データがより整然とします。
例5:欠損値を処理した後にインデックスをリセットする
欠損値を含む行を削除した後も、インデックスをリセットできます。
例
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_cleaned = df.dropna()
print("删除缺失值后(索引不连续):")
print(df_cleaned)
print("=" * 50)
# 重置索引
df_reset = df_cleaned.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
import numpy as np
# 欠損値を含むDataFrameを作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [85, np.nan, 92, 78]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 欠損値を含む行を削除
df_cleaned = df.dropna()
print("删除缺失值后(索引不连续):")
print(df_cleaned)
print("=" * 50)
# 重置索引
df_reset = df_cleaned.reset_index(drop=True)
print("重置索引后:")
print(df_reset)
実行結果の予想:
原始数据: 姓名 成绩 0 张三 85.0 1 李四 NaN # 缺失值 2 王五 92.0 3 赵六 78.0 ================================================== 删除缺失值后(索引不连续): 姓名 成绩 0 张三 85.0 2 王五 92.0 3 赵六 78.0
コードの解説:
- 1行目(李四の成績が NaN)を削除した後、保持されるインデックスは 0、2、3 です。
- 使用して
reset_index()0、1、2 の連続したインデックスを得られます。
例6:inplace パラメータを使用してその場で変更する
使用してinplace=True元の DataFrame 上で直接変更できます。
例
import pandas as pd
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 筛选数据
df_filtered = df[df['成绩'] > 80]
print(フィルタリング後のデータ(未リセット):)
print(df_filtered)
print(f"データ id: {id(df_filtered)}")
print("=" * 50)
# inplace=True を使用してインデックスを元の場所でリセット
df_filtered.reset_index(drop=True, inplace=True)
print("inplace=True を使用してリセット後:")
print(df_filtered)
print(f"データ id: {id(df_filtered)}")
import numpy as np
# 创建一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'成绩': [85, 92, 78]
}
df = pd.DataFrame(data)
# 筛选数据
df_filtered = df[df['成绩'] > 80]
print(フィルタリング後のデータ(未リセット):)
print(df_filtered)
print(f"データ id: {id(df_filtered)}")
print("=" * 50)
# inplace=True を使用してインデックスを元の場所でリセット
df_filtered.reset_index(drop=True, inplace=True)
print("inplace=True を使用してリセット後:")
print(df_filtered)
print(f"データ id: {id(df_filtered)}")
実行結果の予想:
筛选后的数据(未重置): 姓名 成绩 1 李四 92 0 张三 85 数据 id: 140234567890 ================================================== 使用 inplace=True 重置后: 姓名 成绩 0 李四 92 1 张三 85 数据 id: 140234567890 # 同一个对象
コード解説:
- 使用
inplace=True後、DataFrame のメモリアドレス(id)は変わりません。 - この方法でメモリを節約できます。
例7:マルチインデックスのリセット
マルチレベルインデックス(MultiIndex)の場合、特定のレベルまたはすべてのレベルをリセットできます。
例
import pandas as pd
import numpy as np
# マルチレベルインデックスの DataFrame を作成
df = pd.DataFrame({
'成績': [85, 92, 78, 88, 90, 95]
}, index=pd.MultiIndex.from_tuples([
('1組', '張三'), ('1組', '李四'), ('1組', '王五'),
('2組', '趙六'), ('2組', '銭七'), ('2組', '孫八')
], names=['クラス', '氏名']))
print("元のデータ(マルチレベルインデックス):")
print(df)
print("=" * 50)
# すべてのインデックスレベルをリセット
df_reset_all = df.reset_index()
print("すべてのインデックスレベルをリセット:")
print(df_reset_all)
print("=" * 50)
# 最初のインデックスレベル(クラス)のみをリセット
df_reset_first = df.reset_index(level=0)
print("クラスのインデックスのみをリセット:")
print(df_reset_first)
import numpy as np
# マルチレベルインデックスの DataFrame を作成
df = pd.DataFrame({
'成績': [85, 92, 78, 88, 90, 95]
}, index=pd.MultiIndex.from_tuples([
('1組', '張三'), ('1組', '李四'), ('1組', '王五'),
('2組', '趙六'), ('2組', '銭七'), ('2組', '孫八')
], names=['クラス', '氏名']))
print("元のデータ(マルチレベルインデックス):")
print(df)
print("=" * 50)
# すべてのインデックスレベルをリセット
df_reset_all = df.reset_index()
print("すべてのインデックスレベルをリセット:")
print(df_reset_all)
print("=" * 50)
# 最初のインデックスレベル(クラス)のみをリセット
df_reset_first = df.reset_index(level=0)
print("クラスのインデックスのみをリセット:")
print(df_reset_first)
実行結果の予想:
原始数据(多层索引):
成绩
班级 姓名
一班 张三 85
李四 92
王五 78
二班 赵六 88
钱七 90
孙八 95
==================================================
重置所有索引级别:
班级 姓名 成绩
0 一班 张三 85
1 一班 李四 92
2 一班 王五 78
3 二班 赵六 88
4 二班 钱七 90
5 二班 钱七 95
コード解説:
- マルチレベルインデックスの DataFrame は
reset_index()インデックスを列に変換できます。 - 使用
levelパラメータでどのレベルのインデックスをリセットするかを選択できます。 reset_index()デフォルトでは元の DataFrame は変更されません。元の場所で変更したい場合は、inplace=Trueパラメータを使用します。- デフォルトでは(
drop=False)、元のインデックスは新しい列として保持されます。保持する必要がない場合は、drop=True。 - を使用
reset_index()前に、保持すべき重要なインデックス情報がないことを確認してください。 - 時系列データの場合、インデックスをリセットした後、時間インデックスを再設定する必要があるかもしれません。
- チェーン操作(フィルタリング後の並べ替えなど)では、操作のたびにインデックスが変わる可能性があるため、適宜
reset_index()を使用すると、コードの予測可能性を維持できます。
注意事項
その他の拡張
Pandas よく使用される関数