Вот мой код для генерации кадра данных:
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
Итак, вот мой вопрос: что означает ось в пандах?
axis=0
агрегируется по строкам иaxis=1
агрегируется по столбцам, заключается в том, как вы индексируете в фрейм данных. Indf.iloc[row, column]
,row
находится в позиции индекса 0 иcolumn
в позиции индекса 1. Numpy обобщает это на N измерений, в которых размышления с точки зрения оси, в которой происходит агрегация агрегации, начинают иметь больше смысла, чем «по строкам» или «по столбцам». ».df.drop("A", axis = 1)
A будет удален. Это не «по ряду» и не «по ряду», а отбрасывание столбца А.axis=0
означает каждую строку как массив, мы можем манипулировать только между строками DataFrame вместо внутренней строки.axis=1
означает каждый столбец как массив, мы можем манипулировать только внутренним столбцом DataFrame вместо внутреннего столбца. Так что, если вы используетеdf.drop("A", axis = 1)
, он уронит целый столбец.Эти ответы помогают объяснить это, но все же они не совсем понятны для непрограммиста (то есть такого, как я, который изучает Python впервые в контексте курсовых работ по науке о данных). Я все еще нахожу, что использование терминов «вдоль» или «для каждого» по отношению к строкам и столбцам сбивает с толку.
Что имеет больше смысла для меня, так это сказать так:
Таким образом, среднее по оси 0 будет средним для всех строк в каждом столбце, а среднее по оси 1 будет средним для всех столбцов в каждой строке.
В конечном счете это говорит о том же, что и @zhangxaochen и @Michael, но таким образом, что мне легче усваивать.
источник
Давайте представим (вы будете помнить всегда),
В Пандах:
Предположим, что для выполнения операции concat () на dataframe1 и dataframe2 мы возьмем dataframe1 и вытащим 1-ую строку из dataframe1 и поместим в новый DF, затем вытащим еще одну строку из dataframe1 и поместим в новый DF, повторяем этот процесс до мы достигаем до конца dataframe1. Затем мы делаем тот же процесс для dataframe2.
По сути, укладка dataframe2 поверх dataframe1 или наоборот.
Например, сделать кучу книг на столе или на полу
Предположим, что для выполнения операции concat () над dataframe1 и dataframe2 мы вытащим 1-й полный столбец (или 1-ю серию) dataframe1 и поместим в новый DF, затем вытащим второй столбец dataframe1 и держимся рядом с ним (сбоку) ) , мы должны повторить эту операцию, пока все столбцы не будут закончены. Затем мы повторим тот же процесс на dataframe2. По сути, стекирование dataframe2 сбоку.
Например, расставляя книги на книжной полке.
источник
axis
относится к измерению массива, в случаеpd.DataFrame
saxis=0
это измерение, которое указывает вниз, аaxis=1
то, что указывает вправо.Пример: придумать
ndarray
форму(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
иa.sum(axis=0)
оба будут выглядеть такВ a
pd.DataFrame
оси работают так же, как вnumpy.array
s:axis=0
будет применятьсяsum()
или любая другая функция сокращения для каждого столбца.NB. В ответе @ zhangxaochen я нахожу фразы «вдоль рядов» и «вдоль столбцов» слегка запутанными.
axis=0
следует ссылаться на «вдоль каждого столбца» иaxis=1
«вдоль каждого ряда».источник
Самый простой способ понять это - поговорить о том, рассчитываете ли вы статистику для каждого столбца (
axis = 0
) или каждой строки (axis = 1
). Если вы вычисляете статистику, скажем среднее,axis = 0
вы получите эту статистику для каждого столбца. Таким образом, если каждое наблюдение представляет собой строку, а каждая переменная находится в столбце, вы получите среднее значение для каждой переменной. Если вы установите,axis = 1
то вы будете рассчитывать статистику для каждой строки. В нашем примере вы получите среднее значение для каждого наблюдения по всем вашим переменным (возможно, вы хотите получить среднее значение для связанных показателей).axis = 0
: по столбцу = по столбцу = вдоль строкaxis = 1
: по ряду = по рядам = вдоль столбцовисточник
axis=0
мы не остаемся в ряду, когда, скажем, вычисляем среднее; скорее мы проходим все строки в столбце.Давайте посмотрим на таблицу из вики. Это оценка МВФ ВВП с 2010 по 2019 год для десяти стран.
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
метод.источник
Ось с точки зрения программирования - это позиция в кортеже формы. Вот пример:
Среднее значение по оси приведет к удалению этого измерения.
Обращаясь к исходному вопросу, форма dff имеет вид (1,2). Использование оси = 1 изменит форму на (1,).
источник
Уэс МакКинни, дизайнер панд, интенсивно работал над финансовыми данными. Думайте о столбцах как об именах акций и индексируйте как ежедневные цены. Затем вы можете угадать, как по умолчанию (то есть,
axis=0
) по отношению к этим финансовым данным.axis=1
можно просто думать как «другое направление».Например, функции статистики, такие как
mean()
,sum()
,describe()
,count()
все по умолчанию столбцов , потому что это имеет смысл , чтобы сделать их для каждой акции.sort_index(by=)
также по умолчанию столбец.fillna(method='ffill')
будет заполнять вдоль столбца, потому что это тот же запас.dropna()
по умолчанию грести, потому что вы, вероятно, просто хотите сбросить цену в этот день, а не выбрасывать все цены этой акции.Аналогично, индексирование в квадратных скобках относится к столбцам, так как чаще выбирают акции, а не выбирают день.
источник
один из простых способов запомнить ось 1 (столбцы), а ось 0 (строки) - это ожидаемый результат.
источник
pd.concat
илиdf.dropna()
, которые используют ось Kewarg в большей степени идентификации.Проблема
axis=
правильного использования заключается в его использовании в двух основных случаях:Основная идея этого ответа заключается в том, что во избежание путаницы мы выбираем либо число , либо имя для указания конкретной оси, в зависимости от того , какая из них является более понятной, интуитивно понятной и описательной.
Pandas основан на NumPy, который основан на математике, особенно на n-мерных матрицах. Вот изображение для общего использования имен осей в математике в трехмерном пространстве:
Это изображение для запоминания только порядковых номеров осей :
0
для оси х,1
для оси Y и2
для оси Z.Ось г только для панелей ; для фреймов данных мы ограничим наш интерес двумерной базовой плоскостью зеленого цвета с осью X (по
0
вертикали) и осью Y (по1
горизонтали).Это все для чисел, как потенциальные значения
axis=
параметра.В названии осей является
'index'
(вы можете использовать псевдоним'rows'
) и'columns'
, и для этого объяснения это не важно соотношения между этими именами и порядковыми номерами (оси), так как все знают , что слова «строка» и «столбцы» означает ( и все здесь - я полагаю - знают, что означает слово «индекс» в пандах).А теперь мой совет:
Если вы хотите вычислить накопленное значение , вы можете вычислить его из значений, расположенных вдоль оси 0 (или вдоль оси 1 ) - используйте
axis=0
(илиaxis=1
).Точно так же, если вы хотите переставить значения , используйте номер оси оси, вдоль которой расположены данные для переупорядочения (например, для сортировки ).
Если вы хотите манипулировать (например, объединять ) объектами (например, кадрами данных ) - используйте
axis='index'
(synonym:)axis='rows'
илиaxis='columns'
укажите результирующее изменение - индекс ( строки ) или столбцы , соответственно.(Для объединения вы получите либо более длинный индекс (= больше строк) , либо больше столбцов соответственно.)
источник
Это основано на ответе @ Safak. Лучший способ понять оси в pandas / numpy - создать трехмерный массив и проверить результат функции суммы по 3 различным осям.
будет:
Теперь проверим сумму элементов массива по каждой из осей:
даст вам следующие результаты:
источник
Я так понимаю
Скажем, если ваша операция требует перемещения слева направо / справа налево в кадре данных, вы, очевидно, объединяете столбцы, т.е. вы работаете на разных колонках. Это ось = 1
пример
Точно так же, если ваша операция требует перемещения сверху вниз / снизу вверх в кадре данных, вы объединяете строки. Это ось = 0 .
источник
ось = 0 означает вверх, вниз ось = 1 означает слева направо
Данный пример берет сумму всех данных в столбце == ключ.
источник
Мое мышление: Ось = n, где n = 0, 1 и т. Д. Означает, что матрица свернута (сложена) вдоль этой оси. Таким образом, в двумерной матрице, когда вы складываете вдоль 0 (строк), вы действительно работаете с одним столбцом за раз. Аналогично для матриц высшего порядка.
Это не то же самое, что нормальная ссылка на измерение в матрице, где 0 -> строка и 1 -> столбец. Аналогично для других измерений в массиве N измерений.
источник
Я новичок в пандах. Но вот как я понимаю ось в пандах:
Постоянная ось, изменяющееся направление
0 Столбец Строка Вниз |
1 рядная колонна направо ->
Таким образом, чтобы вычислить среднее значение столбца, этот конкретный столбец должен быть постоянным, но строки под ним могут меняться ( изменяться ), поэтому его ось = 0.
Точно так же, чтобы вычислить среднее значение строки, эта конкретная строка является константой, но она может проходить через разные столбцы (разные) , ось = 1.
источник
Я думаю, что есть другой способ понять это.
Для np.array, если мы хотим исключить столбцы, мы используем axis = 1; если мы хотим исключить строки, мы используем axis = 0.
Для объекта «Панды»
axis = 0
обозначает построчную операцию иaxis = 1
колонную операцию. Это отличается отnumpy
определения, мы можем проверить определения из numpy.doc и pandas.docисточник
Я буду явно избегать использования «построчно» или «вдоль столбцов», так как люди могут интерпретировать их совершенно неправильно.
Сначала аналогия. Интуитивно, вы можете ожидать, что
pandas.DataFrame.drop(axis='column')
удалит столбец из N столбцов и даст вам (N - 1) столбцов. Таким образом, вы можете не обращать внимания на строки на данный момент (и удалить слово 'row' из своего английского словаря). И наоборот,drop(axis='row')
работает со строками.Таким же образом,
sum(axis='column')
работает на нескольких столбцах и дает вам 1 столбец. Аналогично,sum(axis='row')
результаты в 1 строке. Это согласуется с его самой простой формой определения, сводящей список чисел к одному числу.В общем,
axis=column
вы видите столбцы, работаете со столбцами и получаете столбцы. Забудьте строки.С помощью
axis=row
меняйте перспективу и работайте над строками.0 и 1 - это просто псевдонимы для строк и столбцов. Это соглашение о матричной индексации.
источник
pd.concat
ваше объяснение, это не совсем работает. Не могли бы вы объяснить поведение concat с двумя осями, пожалуйста? Спасибо.Я пытался вычислить ось в течение последнего часа. Язык во всех вышеперечисленных ответах, а также документация совсем не помогают.
Чтобы ответить на вопрос, как я его понимаю, в Pandas axis = 1 или 0 означает, какие заголовки осей вы хотите оставить постоянными при применении функции.
Примечание: когда я говорю заголовки, я имею в виду имена индексов
Расширяем ваш пример:
Для оси = 1 = столбцы: мы сохраняем постоянные заголовки столбцов и применяем функцию среднего значения путем изменения данных. Для демонстрации мы оставляем заголовки столбцов постоянными:
Теперь мы заполняем один набор значений A и B, а затем находим среднее
Затем мы заполняем следующий набор значений A и B и находим среднее
Аналогично, для axis = row мы сохраняем константы заголовков строк и продолжаем изменять данные. Для демонстрации сначала исправьте заголовки строк:
Теперь заполните первый набор значений X и Y, а затем найдите среднее
Затем заполните следующий набор значений X и Y и затем найдите среднее значение:
В итоге,
Когда ось = столбцы, вы фиксируете заголовки столбцов и изменяете данные, которые будут поступать из разных строк.
Когда ось = строки, вы фиксируете заголовки строк и изменяете данные, которые будут поступать из разных столбцов.
источник
axis = 1, Это даст строку суммы, мудрый, keepdims = True сохранит 2D измерение. Надеюсь, это поможет вам.
источник
Многие ответы здесь мне очень помогли!
Если вас смущают различные варианты поведения
axis
в Python иMARGIN
R (как вapply
функции), вы можете найти интересную запись в блоге: https://accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html .По сути:
numpy
иpandas
параметр axis в сумме фактически указывает значение numpy для вычисления среднего значения всех значений, которые могут быть получены в виде массива [0, 0, ..., i, ..., 0], где я выполняю итерацию все возможные значения. Процесс повторяется с фиксированным положением i, и индексы других измерений меняются один за другим (от самого правого элемента). Результатом является n-1-мерный массив.apply
функции вычислять среднее значение всех значений, которые могут быть получены в виде массива [, ..., i, ...,], где i выполняет итерацию по всем возможным значениям. Процесс не повторяется, когда все значения i были повторены. Следовательно, результатом является простой вектор.источник
Массивы спроектированы с так называемой осью = 0, а строки расположены вертикально против оси = 1, а столбцы расположены горизонтально. Ось относится к размеру массива.
источник
axis=0
означает, что каждая строка является объемной, мы можем манипулировать только между строками DataFrame вместо внутренней строки.axis=1
означает каждый столбец как массив, мы можем манипулировать только внутренним столбцом DataFrame вместо внутреннего столбца.