Что означает ось в pandas?

Вот мой код для генерации данных:

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))

то я получил dataframe:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+

Когда я ввожу commmand:

dff.mean(axis=1)

Я получил:

0    1.074821
dtype: float64

Согласно ссылке pandas, ось = 1 обозначает столбцы, и я ожидаю, что результатом команды будет

A    0.626386
B    1.523255
dtype: float64

Итак, вот мой вопрос: что означает ось в pandas?

Ответ 1

Он определяет ось, по которой вычисляются средние значения. По умолчанию axis=0. Это согласуется с использованием numpy.mean когда axis указана явно (в numpy.mean, axis == нет по умолчанию, что вычисляет среднее значение для уплощенного массива), в котором axis=0 вдоль строк (а именно, индекс в пандах), а axis=1 вдоль столбцов. Для большей ясности можно выбрать для указания axis='index' (вместо axis=0) или axis='columns' (вместо axis=1).

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
             ↓         ↓

Ответ 2

Эти ответы помогают объяснить это, но он по-прежнему не совсем интуитивно понятен для не-программиста (например, кто-то вроде меня, который впервые изучает Python в контексте курсовой работы в области данных). Я по-прежнему считаю, что использование терминов "вдоль" или "для каждого" по отношению к строкам и столбцам вызывает путаницу.

Что имеет для меня больше смысла, так сказать:

  • Ось 0 будет действовать во всех ROWS в каждой COLUMN
  • Axis 1 будет действовать во всех COLUMNS в каждом ROW

Таким образом, среднее значение по оси 0 будет средним для всех строк в каждом столбце, а среднее значение по оси 1 будет означать среднее значение для всех столбцов в каждой строке.

В конечном итоге это говорит то же самое, что @zhangxaochen и @Michael, но так, что мне легче усваивать.

Ответ 3

Позвольте визуализировать (вы будете помнить всегда), enter image description here

В Пандах:

  1. Ось = 0 означает вдоль "индексы". Это строчная операция.

Предположим, что для выполнения операции concat() над dataframe1 и dataframe2 мы возьмем dataframe1, вытащим 1-ую строку из dataframe1 и поместим в новый DF, затем вытащим еще одну строку из dataframe1 и поместим в новый DF, повторяем этот процесс до мы достигаем до конца dataframe1. Затем мы делаем тот же процесс для dataframe2.

По сути, размещение dataframe2 поверх dataframe1 или наоборот.

Например, сделать кучу книг на столе или на полу

  1. Ось = 1 означает вдоль "столбцов". Это столбцовая операция.

Предположим, что для выполнения операции concat() над dataframe1 и dataframe2 мы вытащим 1-й полный столбец (или 1-ю серию) dataframe1 и поместим в новый DF, затем вытащим второй столбец dataframe1 и держимся рядом с ним (сбоку) ), мы должны повторить эту операцию, пока все столбцы не будут закончены. Затем мы повторим тот же процесс на dataframe2. По сути, стекирование dataframe2 сбоку.

Например, расставлять книги на книжной полке.

Более того, поскольку массивы являются лучшими представлениями для представления вложенной n-мерной структуры по сравнению с матрицами! поэтому ниже может помочь вам более наглядно представить, как ось играет важную роль, когда вы обобщаете в более чем одно измерение. Кроме того, вы можете фактически напечатать/записать/нарисовать/визуализировать любой массив n-dim, но на бумаге более 3-х измерений невозможно написание или визуализация одного и того же в матричном представлении (3-dim).

enter image description here

Ответ 4

axis относится к размеру массива, в случае pd.DataFrame axis=0 - размер, который указывает вниз, и axis=1 тот, который указывает справа.

Пример: Подумайте о ndarray с формой (3,5,7).

a = np.ones((3,5,7))

a является трехмерным ndarray, т.е. имеет 3 оси ( "оси" - множественное число "оси" ). Конфигурация a будет выглядеть как 3 ломтика хлеба, где каждый срез имеет размер 5 на 7. a[0,:,:] будет ссылаться на 0-й срез, a[1,:,:] будет ссылаться на 1-й срез и т.д.

a.sum(axis=0) будет применяться sum() вдоль 0-й оси a. Вы добавите все фрагменты и получите один фрагмент формы (5,7).

a.sum(axis=0) эквивалентно

b = np.zeros((5,7))
for i in range(5):
    for j in range(7):
        b[i,j] += a[:,i,j].sum()

b и a.sum(axis=0) будут выглядеть так:

array([[ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.]])

В a pd.DataFrame оси работают так же, как в numpy.array s: axis=0 будет применяться sum() или любая другая функция сокращения для каждого столбца.

N.B. В ответе @zhangxaochen я нахожу фразы "вдоль строк" ​​и "вдоль столбцов" несколько запутанными. axis=0 следует ссылаться на "вдоль каждого столбца" и axis=1 "вдоль каждой строки".

Ответ 5

Самый простой способ понять - рассказать о том, вычисляете ли вы статистику для каждого столбца (axis = 0) или каждой строки (axis = 1). Если вы вычисляете статистику, скажем, среднее значение, axis = 0, вы получите эту статистику для каждого столбца. Поэтому, если каждое наблюдение представляет собой строку, и каждая переменная находится в столбце, вы получите среднее значение для каждой переменной. Если вы установите axis = 1, тогда вы будете рассчитывать свою статистику для каждой строки. В нашем примере вы получите среднее значение для каждого наблюдения по всем вашим переменным (возможно, вы хотите получить среднее значение соответствующих мер).

axis = 0: по столбцу = column-wise = вдоль строк

axis = 1: по строке = row-wise = вдоль столбцов

Ответ 6

Ось с точки зрения программирования - это положение в корте. Вот пример:

import numpy as np

a=np.arange(120).reshape(2,3,4,5)

a.shape
Out[3]: (2, 3, 4, 5)

np.sum(a,axis=0).shape
Out[4]: (3, 4, 5)

np.sum(a,axis=1).shape
Out[5]: (2, 4, 5)

np.sum(a,axis=2).shape
Out[6]: (2, 3, 5)

np.sum(a,axis=3).shape
Out[7]: (2, 3, 4)

Среднее значение на оси приведет к удалению измерения.

Ссылаясь на исходный вопрос, dff-форма равна (1,2). Использование оси = 1 изменит форму на (1,).

Ответ 7

Дизайнер pandas, Уэс МакКинни, интенсивно работал над финансовыми данными. Подумайте о столбцах как имена акций и индекс, как ежедневные цены. Затем вы можете догадаться, что такое поведение по умолчанию (т.е. axis=0) в отношении этих финансовых данных. axis=1 можно просто считать "другим направлением".

Например, функции статистики, такие как mean(), sum(), describe(), count(), все по умолчанию имеют значение по столбцам, потому что имеет смысл делать их для каждого запаса. sort_index(by=) также по умолчанию используется столбец. fillna(method='ffill') будет заполняться вдоль столбца, потому что это тот же самый запас. dropna() по умолчанию используется строка, потому что вы, вероятно, просто хотите отказаться от цены в этот день, а не выбрасывать все цены этого запаса.

Аналогично, индексирование квадратных скобок относится к столбцам, поскольку чаще всего выбирается запас вместо того, чтобы выбирать день.

Ответ 8

Давай посмотрим на таблицу из вики. Это оценка МВФ ВВП с 2010 по 2019 год для десяти стран. enter image description here

1. Ось 1 будет действовать для каждой строки во всех столбцах.
Есливы хотите рассчитать средний (средний) ВВП для КАЖДОЙ страны за десятилетие (2010-2019 гг.), Вам нужно это сделать, df.mean(axis=1). Например, если вы хотите рассчитать средний ВВП США с 2010 по 2019 год, df.loc['United States','2010':'2019'].mean(axis=1)

2. Ось 0 будет действовать для каждого столбца во всех строках.
Если я хочу рассчитать средний (средний) ВВП для КАЖДОГО года для всех стран, вам нужно это сделать, df.mean(axis=0). Например, если вы хотите рассчитать средний ВВП 2015 года для США, Китая, Японии, Германии и Индии, df.loc['United States':'India','2015'].mean(axis=0)

Примечание: Приведенный выше код будет работать только после установки столбца "Страна (или зависимая территория)" в качестве индекса с использованием метода set_index.

Ответ 9

один из простых способов запомнить ось 1 (столбцы), а ось 0 (строки) - это ожидаемый результат.

  • если вы ожидаете вывод для каждой строки, вы используете axis = 'columns',
  • с другой стороны, если вы хотите вывод для каждого столбца, вы используете axis = 'lines'.

Ответ 10

Это основано на ответе @Safak. Лучший способ понять оси в pandas/numpy - создать трехмерный массив и проверить результат функции суммы по 3 различным осям.

 a = np.ones((3,5,7))

будет:

    array([[[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]]])

Теперь проверим сумму элементов массива по каждой из осей:

 x0 = np.sum(a,axis=0)
 x1 = np.sum(a,axis=1)
 x2 = np.sum(a,axis=2)

даст вам следующие результаты:

   x0 :
   array([[3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.]])

   x1 : 
   array([[5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.]])

  x2 :
   array([[7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.]])

Ответ 11

axis = 0 означает до нуля ось = 1 означает слева направо

sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)

В данном примере берется сумма всех данных в столбце ==.

Ответ 12

Проблема с использованием axis= правильно заключается в его использовании в 2 основных случаях:

  1. Для вычисления накопленного значения или переупорядочения (например, сортировки) данных.
  2. Для манипулирования ("игры") объектами (например, кадрами данных).

Основная идея этого ответа заключается в том, что во избежание путаницы мы выбираем либо число, либо имя для указания конкретной оси, в зависимости от того, какая из них является более понятной, интуитивно понятной и описательной.

Pandas основан на NumPy, который основан на математике, особенно на n-мерных матрицах. Вот изображение для общего использования имен осей в математике в трехмерном пространстве:

enter image description here Это изображение для запоминания только порядковых номеров осей:

  • 0 для оси X,
  • 1 для оси Y и
  • 2 для оси Z.

Ось Z предназначена только для панелей; для фреймов данных мы ограничим наш интерес двумерной базовой плоскостью зеленого цвета с осью X (0, по вертикали) и осью Y (1, по горизонтали).

enter image description here Это все для чисел как потенциальных значений axis= параметра.

Имена осей - 'index' (вы можете использовать псевдоним 'rows') и 'columns', и для этого объяснения НЕ важно отношение между этими именами и порядковыми номерами (осей), так как каждый знает, что такое слова "строки" и "столбцы" означают (и все здесь - я полагаю - знают, что означает слово "индекс" в пандах).

А теперь мой совет:

  1. Если вы хотите вычислить накопленное значение, вы можете рассчитать его по значениям, расположенным вдоль оси 0 (или вдоль оси 1) - используйте axis=0 (или axis=1).

    Точно так же, если вы хотите переставить значения, используйте номер оси оси, вдоль которой расположены данные для переупорядочения (например, для сортировки).

  2. Если вы хотите манипулировать (например, объединять) объектами (например, фреймами данных) - используйте axis='index' (синоним: axis='rows') или axis='columns' чтобы указать результирующее изменение - индекс (строки) или столбцы, соответственно,
    (Для объединения вы получите либо более длинный индекс (= больше строк), либо больше столбцов соответственно.)

Ответ 13

Я буду явно избегать использования "по строкам" или "вдоль столбцов", поскольку люди могут интерпретировать их совершенно неверно.

Сначала аналогия. Интуитивно понятно, что вы ожидаете, что pandas.DataFrame.drop(axis='column') удалит столбец из N столбцов и даст вам (N - 1) столбцов. Таким образом, вы можете НЕ обращать внимания на строки (и удалить слово "строка" из своего словаря английского языка.) И наоборот, drop(axis='row') работает со строками.

Точно так же sum(axis='column') работает с несколькими столбцами и дает вам 1 столбец. Аналогично, sum(axis='row') приводит к 1 строке. Это согласуется с его самой простой формой определения, сводящей список чисел к одному числу.

В общем, с axis=column вы видите столбцы, работаете над столбцами и получаете столбцы. Забудьте строки.

С помощью axis=row измените перспективу и работайте со строками.

0 и 1 - это просто псевдонимы для строк и столбцов. Это соглашение матричной индексации.

Ответ 14

Мое мышление: Ось = n, где n = 0, 1 и т.д. Означает, что матрица свернута (сложена) вдоль этой оси. Таким образом, в двумерной матрице, когда вы сжимаете вдоль 0 (строк), вы действительно работаете с одним столбцом за раз. Аналогично для матриц высшего порядка.

Это не то же самое, что нормальная ссылка на измерение в матрице, где 0 → строка и 1 → столбец. Аналогично для других измерений в массиве N измерений.

Ответ 15

Я новичок в пандах. Но вот как я понимаю ось в пандах:


Ось постоянная изменяющееся направление


0 Столбец Строка Вниз |


1 рядная колонна направо ->


Таким образом, чтобы вычислить среднее значение столбца, этот конкретный столбец должен быть постоянным, но строки под ним могут изменяться ( изменяться ), поэтому его ось = 0.

Точно так же, чтобы вычислить среднее значение строки, эта конкретная строка является константой, но она может проходить через разные столбцы (изменяющиеся), ось = 1.

Ответ 16

Я так понимаю

Скажем, если ваша операция требует перемещения слева направо/справа налево в кадре данных, вы, очевидно, объединяете столбцы, т.е. вы работаете на разных колонках. Это ось = 1

пример

df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
print(df)
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11 

df.mean(axis=1)

0    1.5
1    5.5
2    9.5
dtype: float64

df.drop(['A','B'],axis=1,inplace=True)

    C   D
0   2   3
1   6   7
2  10  11

Обратите внимание, здесь мы работаем над столбцами

Точно так же, если ваша операция требует перемещения сверху вниз/снизу вверх в кадре данных, вы объединяете строки. Это ось = 0.

Ответ 17

Я думаю, что есть другой способ понять это.

Для np.array, если мы хотим исключить столбцы, мы используем axis = 1; если мы хотим исключить строки, мы используем axis = 0.

np.mean(np.array(np.ones(shape=(3,5,10))),axis = 0).shape # (5,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = 1).shape # (3,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = (0,1)).shape # (10,)

Для объекта pandas, axis = 0 обозначает построчную операцию, а axis = 1 обозначает построчную операцию. Это отличается от numpy по определению, мы можем проверить определения из numpy.doc и pandas.doc

Ответ 18

Массивы спроектированы с так называемой осью = 0, а строки расположены вертикально против оси = 1, а столбцы расположены горизонтально. Ось относится к размеру массива. Illustration

Ответ 19

Это означает, что для каждого столбца использовалось среднее значение, ось = 0 дала бы вам то, что вы думаете, но ось = 1 дает

 (0.626386+1.52325)/2
 1.075