Функция Pandas df.reset_index()
Часто используемые функции Pandas
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='')
Описание параметра
| Параметр | Type | Обязательный | Описание | Значение по умолчанию |
|---|---|---|---|---|
| level | int, str, tuple или list | Optional | Задает уровень (уровни) индекса для сброса. Для MultiIndex можно выбрать, какие уровни сбросить. По умолчанию сбрасываются все уровни. | Отсутствует |
| drop | bool | Optional | Если он равенTrue, отбросить исходный индекс, не преобразуя его в столбец; если онFalse, сохранить исходный индекс как новый столбец. |
False |
| inplace | bool | Optional | Если он равенTrue, изменяет исходный DataFrame напрямую и не возвращает новый объект; если он равенFalse, вернуть новый DataFrame и оставить исходные данные без изменений. |
False |
| col_level | int или str | Optional | Если имена столбцов являются MultiIndex, укажите уровень, в который нужно вставить индекс. | 0 |
| col_fill | str | Optional | Если имена столбцов являются MultiIndex, это используется для заполнения имен столбцов других уровней, когда исходный индекс преобразуется в столбец. | '' |
Описание возвращаемого значения
- Возвращает новый DataFrame (если
inplace=False), илиNone(еслиinplace=True)。 - В возвращаемом DataFrame индекс сброшен. Исходный индекс (если
drop=False) будет сохранен как новый столбец.
Примеры
Давайте основательно освоим это на серии примеров,reset_index()использование.
Пример 1: базовое использование — сброс индекса
Наиболее распространённое использование — сбросить индекс к стандартному целочисленному индексу.
Пример
import numpy as np
# Создать DataFrame
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У'],
'Score': [85, 92, 78]
}
df = pd.DataFrame(data)
print(Исходные данные (индекс по умолчанию):)
print(df)
print("=" * 50)
# Сортировка данных, в результате чего индекс становится несмежным
df_sorted = df.sort_values(by='Score', 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 numpy as np
# Создать DataFrame
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У'],
'Score': [85, 92, 78]
}
df = pd.DataFrame(data)
# Сортировка данных
df_sorted = df.sort_values(by='Score', 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 numpy as np
# Создать DataFrame, содержащий все оценки студентов
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Qian Qi'],
'Score': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data)
print(“Исходные данные:”)
print(df)
print("=" * 50)
# Отфильтровать студентов с баллами больше 85
df_filtered = df[df['Score'] > 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 numpy as np
# Создать DataFrame с дублирующимися строками
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Чжан Сань', 'Wang Wu'],
'city': ['Пекин', 'Шанхай', 'Пекин', 'Guangzhou']
}
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 numpy as np
# Создайте DataFrame с пропущенными значениями
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
'Score': [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 (оценка Li Si равна NaN), сохранённые индексы — 0, 2, 3.
- Использование
reset_index()может дать непрерывный индекс 0, 1, 2.
Пример 6: Использование параметра inplace для изменения на месте
Использованиеinplace=Trueможно напрямую изменять исходный DataFrame.
Пример
import numpy as np
# Создать DataFrame
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У'],
'Score': [85, 92, 78]
}
df = pd.DataFrame(data)
# Фильтрация данных
df_filtered = df[df['Score'] > 80]
print(Отфильтрованные данные (индекс не сброшен):)
print(df_filtered)
print(fИдентификатор данных: {id(df_filtered)})
print("=" * 50)
# Используйте inplace=True для сброса индекса на месте
df_filtered.reset_index(drop=True, inplace=True)
print(После сброса с inplace=True:)
print(df_filtered)
print(fИдентификатор данных: {id(df_filtered)})
Ожидаемый вывод:
筛选后的数据(未重置): 姓名 成绩 1 李四 92 0 张三 85 数据 id: 140234567890 ================================================== 使用 inplace=True 重置后: 姓名 成绩 0 李四 92 1 张三 85 数据 id: 140234567890 # 同一个对象
Пояснение к коду:
- После использования
inplace=True, адрес памяти (id) DataFrame остаётся неизменным. - Этот метод позволяет экономить память.
Пример 7: Сброс многоуровневого индекса
Для MultiIndex можно сбросить отдельные уровни или все уровни.
Пример
import numpy as np
# Создать DataFrame с MultiIndex
df = pd.DataFrame({
'Score': [85, 92, 78, 88, 90, 95]
}, index=pd.MultiIndex.from_tuples([
('Class 1', 'Zhang San'), ('Class 1', 'Li Si'), ('Class 1', 'Wang Wu'),
('Class 2', 'Zhao Liu'), ('Class 2', 'Qian Qi'), ('Class 2', 'Sun Ba')
], names=['Class', 'Name']))
print(Исходные данные (MultiIndex):)
print(df)
print("=" * 50)
# Сбросить все уровни индекса
df_reset_all = df.reset_index()
print(Сбросить все уровни индекса:)
print(df_reset_all)
print("=" * 50)
# Сбросить только первый уровень индекса (Class)
df_reset_first = df.reset_index(level=0)
print(Сбросить только индекс Class:)
print(df_reset_first)
Ожидаемый вывод:
原始数据(多层索引):
成绩
班级 姓名
一班 张三 85
李四 92
王五 78
二班 赵六 88
钱七 90
孙八 95
==================================================
重置所有索引级别:
班级 姓名 成绩
0 一班 张三 85
1 一班 李四 92
2 一班 王五 78
3 二班 赵六 88
4 二班 钱七 90
5 二班 钱七 95
Пояснение к коду:
- DataFrame с MultiIndex может использовать
reset_index()чтобы преобразовать индекс в столбцы. - Используйте
levelпараметр для выбора уровня индекса, который нужно сбросить. reset_index()Исходный DataFrame по умолчанию не изменяется. Чтобы изменить его на месте, используйтеinplace=Trueпараметра.- По умолчанию (
drop=False), исходный индекс сохраняется как новый столбец. Если не нужно его сохранять, используйтеdrop=True。 - Перед использованием
reset_index(), убедитесь, что нет важной информации об индексе, которую нужно сохранить. - Для данных временных рядов может потребоваться сбросить временной индекс после сброса индекса.
- В цепочках операций (таких как фильтрация, затем сортировка) индекс может изменяться после каждой операции. Использование его в нужный момент
reset_index()может сделать код предсказуемым.
Примечания
Другие расширения