Почему 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 соответствует позиции измерения, а не интуитивной ассоциации со строками/столбцами.
Содержание
- Математическое объяснение
- Исторический контекст и влияние 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
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
# Удаление столбцов (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 предоставляет строковые альтернативы, которые более интуитивны:
# Вместо 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. Используйте строковые псевдонимы, когда возможно
# Предпочтительно - более читаемо
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:
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 следует математической индексации матриц, а не интуитивной ассоциации со строками/столбцами. Ключевые выводы:
- Математическая основа: axis=0 представляет первое измерение (столбцы), axis=1 представляет второе измерение (строки)
- Наследование от NumPy: pandas унаследовал это соглашение от операций массивов NumPy
- Практическое толкование: axis указывает, какое измерение следует свернуть/итерировать при операциях
- Используйте строковые псевдонимы: Предпочитайте axis=‘index’ и axis=‘columns’ для лучшей читаемости
- Тестируйте на примерах: Создавайте небольшие DataFrame для проверки поведения axis, когда запутались
Понимание этого соглашения сделает ваш код на pandas более предсказуемым и поможет избежать распространенных ловушек при применении операций к DataFrame.
Источники
- What does axis in pandas mean? - Stack Overflow
- Understanding the Axis Parameter in Pandas - AskPython
- Python for Machine Learning: Pandas Axis Explained | Railsware Blog
- Pandas Axis Meaning | Delft Stack
- The Difference Between axis=0 and axis=1 in Pandas - Statology
- How to Use axis=0 and axis=1 in Pandas? - GeeksforGeeks
- Understanding axis in Pandas with Examples - Medium