it-swarm.com.ru

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

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

import pandas as pd
import numpy as np

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

тогда я получил датафрейм:

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

Когда я набираю команду:

dff.mean(axis=1)

Я получил :

0    1.074821
dtype: float64

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

A    0.626386
B    1.523255
dtype: float64

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

211
jerry_sjtu

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

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

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

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

  • Ось 0 будет действовать на все ряды в каждой колонне 
  • Ось 1 будет действовать на все КОЛОННЫ в каждом ряду

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

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

47
Ken Wallace

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

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

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

a - это 3-мерная 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.arrays: axis=0 будет применять sum() или любую другую функцию сокращения для каждого столбца. 

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

26
Safak Ozkan

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

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

axis = 1: by row = row-wise = вдоль столбцов

20
Michael

Позвольте визуализировать (буду помнить всегда), 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-я серия) dataframe1 и поместим в новый DF, затем вытащим второй столбец dataframe1 и держитесь рядом с ним (в сторону), мы должны повторять эту операцию, пока все столбцы не будут закончены. Затем мы повторяем тот же процесс для dataframe2 . По существу, укладываем dataframe2 вбок.

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

18
anu

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

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

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

8
nos

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

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

6
Mark09

Это основано на ответе @ 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.]])
1
missnomer

ось = 0 означает вверх вниз Ось = 1 означает слева направо

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

Данный пример берет сумму всех данных в столбце == ключ.

1
HeadAndTail

Давайте посмотрим на таблицу из вики. Это оценка МВФ ВВП за период с 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

0
Sumit Pokhrel

Я так понимаю

Скажем, если ваша операция требует перемещения из слева направо/справа налево в кадре данных, вы, очевидно, объединяете столбцы, т.е. вы работаете с различными столбцами . Это ось = 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 .

0
Abhishek Raj

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

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

0
Nkrish

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

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

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

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

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

  • 0 для оси x, 
  • 1 для оси y и 
  • 2 для оси Z.

Ось z предназначена только для панелей; для dataframes мы ограничимся нашим интересом зеленым цветом, 2-мерная базовая плоскость с осью x (0, вертикальная) и осью y (1, горизонтальная ).

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

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

А теперь моя рекомендация:

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

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

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

0
MarianD

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

Для 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

0
Travis

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


Ось Постоянная Варьирующаяся Направление


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


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


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

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

0
Harshana Sridhar