Функция Pandas df.reset_index()

Pandas 常用函数Часто используемые функции 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 pandas as pd
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. После сортировки индекс становится 1, 0, 2, уже не является непрерывным 0, 1, 2.
  2. После использованияreset_index(), индекс сбрасывается до 0, 1, 2.
  3. Исходный индекс сохраняется как новый столбец, "index".

Пример 2: использование параметра drop для удаления исходного индекса

Если вам не нужно сохранять исходный индекс, вы можете использоватьdrop=Trueпараметра.

Пример

import pandas as pd
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 pandas as pd
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 pandas as pd
    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 pandas as pd
      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 pandas as pd
        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 pandas as pd
          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()может сделать код предсказуемым.

            Pandas 常用函数Pandas: общие функции

            Другие расширения