Другое

Почему Pandas использует axis=1 для строк: Полное руководство

Узнайте, почему pandas DataFrame.apply() использует axis=1 для строк вместо axis=0. Изучите математическую основу, наследование от NumPy и практические примеры для освоения параметров axis в pandas. Полное руководство с лучшими практиками.

Почему в pandas DataFrame.apply() для строк используется axis=1 вместо axis=0? Я читал документацию pandas и заметил, что параметр axis кажется противоположным тому, чего я ожидал. Чтобы применить функцию к каждой строке DataFrame, мне нужно использовать axis=1 вместо axis=0. Я всегда думал, что axis=0 означает строки, а axis=1 означает столбцы. Кто-нибудь может объяснить, почему pandas использует такое соглашение?

В pandas DataFrame.apply() axis=1 используется для строк, потому что это соглашение следует математике индексации матриц, где axis=0 представляет первое измерение (столбцы), а axis=1 представляет второе измерение (строки). Этот подход соответствует соглашениям axis numpy и математическим операциям с матрицами, где нумерация axis соответствует позиции измерения, а не интуитивной ассоциации со строками/столбцами.

Содержание

Математическое объяснение

Параметр axis в pandas следует математическому соглашению индексации матриц. В 2D матрице или DataFrame:

  • axis=0 представляет первое измерение (столбцы) - операции перемещаются вертикально вниз по строкам
  • axis=1 представляет второе измерение (строки) - операции перемещаются горизонтально по столбцам

Это основано на том, как математики и компьютерные ученые традиционно индексируют многомерные массивы. Как объясняется в обсуждении на Stack Overflow, “0 и 1 - это просто псевдонимы для ‘строка’ и ‘столбец’. Это соглашение индексации матриц.”

Подумайте об этом так:

  • Когда вы указываете axis=0, вы говорите “выполнять операцию вдоль измерения 0” (столбцы)
  • Когда вы указываете axis=1, вы говорите “выполнять операцию вдоль измерения 1” (строки)

Это становится понятнее, если учесть, что DataFrame pandas по сути являются 2D массивами numpy с дополнительными функциональными возможностями.


Исторический контекст и влияние NumPy

Pandas был создан на основе NumPy, и он унаследовал соглашение axis от операций массивов NumPy. В NumPy:

  • Массивы индексируются как [строка, столбец] или более общо [axis_0, axis_1, axis_2, …]
  • axis=0 относится к первой оси (строки в 2D массиве)
  • axis=1 относится ко второй оси (столбцы в 2D массиве)

Однако при применении операций параметр axis указывает, какую ось свернуть или итерировать. Как объясняется в блоге Railsware, “axis=0 представляет строки, а axis=1 представляет столбцы” в контексте операций DataFrame.

Это создает кажущуюся парадоксальность:

  • Индексирование: df[0,0] получает строку 0, столбец 0
  • Операции: axis=0 работает со строками (сворачивает их), axis=1 работает со столбцами (сворачивает их)

Путаница возникает потому, что параметр axis в операциях относится к какому измерению уменьшать, а не к какому измерению индексировать.


Практические примеры

Давайте проясним на конкретных примерах:

Использование apply() с разными значениями axis

python
import pandas as pd

# Создадим простой DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})

# Применяем сумму вдоль axis=0 (по столбцам - по умолчанию)
column_sums = df.apply(sum, axis=0)
# Результат: A    6, B    15, C    24 (сумма каждого столбца)

# Применяем сумму вдоль axis=1 (по строкам)
row_sums = df.apply(sum, axis=1) 
# Результат: 0    12, 1    15, 2    18 (сумма каждой строки)

Как объясняется на Delft Stack, “axis=0 означает, что функция применяется по столбцам, а axis=1 означает, что функция применяется по строкам в DataFrame.”

Другие операции с параметром axis

python
# Удаление столбцов (axis=1)
df.drop('A', axis=1)  # Удаляет столбец 'A'

# Удаление строк (axis=0) 
df.drop(0, axis=0)    # Удаляет строку 0

# Расчет среднего значения
df.mean(axis=0)       # Среднее значение каждого столбца (по умолчанию)
df.mean(axis=1)       # Среднее значение каждой строки

Источник GeeksforGeeks подтверждает, что “axis = 0 относится к горизонтальной оси или строкам, а axis = 1 относится к вертикальной оси или столбцам” при выполнении действий.


Почему это сбивает с толку

Путаница возникает по нескольким причинам:

1. Интуитивное против математического толкования

Большинство людей интуитивно думают:

  • axis=0 = строки (первое, с чем сталкиваешься)
  • axis=1 = столбцы (второе, с чем сталкиваешься)

Но математически и в pandas:

  • axis=0 = операции вдоль столбцов (первое измерение)
  • axis=1 = операции вдоль строк (второе измерение)

2. Различия в языке и контексте

Как отмечается в обсуждении на Reddit, разные методы могут иметь разные толкования. Для .drop() axis=1 указывает на столбцы, но для .apply() axis=1 означает применение функции к каждой строке.

3. Переменные размеры массивов

Значение axis меняется в зависимости от количества измерений:

  • 1D массив (Series): существует только axis=0
  • 2D массив (DataFrame): axis=0 и axis=1
  • 3D массив: axis=0, axis=1, axis=2

Эта гибкость, хотя и мощная, добавляет сложности.


Альтернативы числовым значениям axis

Чтобы избежать путаницы, pandas предоставляет строковые альтернативы, которые более интуитивны:

python
# Вместо axis=0, используйте:
df.apply(sum, axis='index')    # Операция по строкам (по столбцам)

# Вместо axis=1, используйте:  
df.apply(sum, axis='columns')  # Операция по столбцам (по строкам)

# Примеры удаления
df.drop('A', axis='columns')   # Более явно, чем axis=1
df.drop(0, axis='index')       # Более явно, чем axis=0

Как предлагается в посте на Reddit, использование axis=‘index’ или axis=‘columns’ вместо чисел может сделать ваш код более читаемым и менее подверженным ошибкам.


Лучшие практики

Для эффективной работы с параметрами axis в pandas:

1. Используйте строковые псевдонимы, когда возможно

python
# Предпочтительно - более читаемо
df.apply(sum, axis='columns')
df.drop('column_name', axis='columns')

# Допустимо - общепринятая практика
df.apply(sum, axis=1)
df.drop('column_name', axis=1)

2. Запомните толкование “свертывания”

Думайте о axis так: “Какое измерение следует свернуть/итерировать?”

  • axis=0: Свернуть строки → оперировать по столбцам
  • axis=1: Свернуть столбцы → оперировать по строкам

3. Тестируйте на простых примерах

Если сомневаетесь, создайте небольшой тестовый DataFrame:

python
test_df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
print("Исходный:")
print(test_df)
print("\nAxis=0 (по столбцам):")
print(test_df.apply(sum, axis=0))
print("\nAxis=1 (по строкам):")
print(test_df.apply(sum, axis=1))

4. Консультируйтесь с документацией

Официальная документация pandas предоставляет четкие примеры и объяснения использования axis.

Заключение

Соглашение axis=1 для строк в pandas следует математической индексации матриц, а не интуитивной ассоциации со строками/столбцами. Ключевые выводы:

  1. Математическая основа: axis=0 представляет первое измерение (столбцы), axis=1 представляет второе измерение (строки)
  2. Наследование от NumPy: pandas унаследовал это соглашение от операций массивов NumPy
  3. Практическое толкование: axis указывает, какое измерение следует свернуть/итерировать при операциях
  4. Используйте строковые псевдонимы: Предпочитайте axis=‘index’ и axis=‘columns’ для лучшей читаемости
  5. Тестируйте на примерах: Создавайте небольшие DataFrame для проверки поведения axis, когда запутались

Понимание этого соглашения сделает ваш код на pandas более предсказуемым и поможет избежать распространенных ловушек при применении операций к DataFrame.

Источники

  1. What does axis in pandas mean? - Stack Overflow
  2. Understanding the Axis Parameter in Pandas - AskPython
  3. Python for Machine Learning: Pandas Axis Explained | Railsware Blog
  4. Pandas Axis Meaning | Delft Stack
  5. The Difference Between axis=0 and axis=1 in Pandas - Statology
  6. How to Use axis=0 and axis=1 in Pandas? - GeeksforGeeks
  7. Understanding axis in Pandas with Examples - Medium
Авторы
Проверено модерацией
Модерация
Почему Pandas использует axis=1 для строк: Полное руководство