Что означает ось в пандах?

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

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 

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

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

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

axis относится к размеру массива, в случае pd.DataFrame s 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.]]) 

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

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

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

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

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

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

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

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

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

 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,).

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

Для меня больше смысла говорить так:

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

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

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

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

  (0.626386+1.52325)/2 1.075