Aqui está o meu código para gerar um quadro de dados:
import pandas as pd
import numpy as np
dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))
então eu peguei o dataframe:
+------------+---------+--------+
| | A | B |
+------------+---------+---------
| 0 | 0.626386| 1.52325|
+------------+---------+--------+
Quando digito o comando:
dff.mean(axis=1)
Eu tenho :
0 1.074821
dtype: float64
De acordo com a referência de pandas, axis = 1 representa colunas e espero que o resultado do comando seja
A 0.626386
B 1.523255
dtype: float64
Então, aqui está a minha pergunta: o que significa eixo nos pandas?
axis=0
indica a agregação ao longo das linhas e aaxis=1
agregação nas colunas é devido à maneira como você indexa em um quadro de dados. Emdf.iloc[row, column]
,row
está na posição de índice 0 ecolumn
está na posição de índice 1. Numpy generaliza isso para N dimensões, que é onde o pensamento em termos do eixo em que a agregação é recolhida começa a fazer mais sentido do que "em linha" ou "em coluna" "df.drop("A", axis = 1)
, a coluna A será descartada. Não é "ao longo da linha" nem "em linha", mas está soltando a coluna A. #axis=0
significa cada linha como um volume, só podemos manipular DataFrame entre linhas em vez de linha interna.axis=1
significa cada coluna como um volume, só podemos manipular a inter-coluna do DataFrame em vez da coluna interna. Então, se você usardf.drop("A", axis = 1)
, ele soltará uma coluna inteira.Essas respostas ajudam a explicar isso, mas ainda não é perfeitamente intuitivo para quem não é programador (ou seja, alguém como eu que está aprendendo Python pela primeira vez no contexto de cursos de ciência de dados). Ainda acho que usar os termos "along" ou "for each" para linhas e colunas é confuso.
O que faz mais sentido para mim é dizer desta maneira:
Portanto, uma média no eixo 0 será a média de todas as linhas em cada coluna e uma média no eixo 1 será a média de todas as colunas em cada linha.
Em última análise, isso está dizendo a mesma coisa que @zhangxaochen e @Michael, mas de uma maneira que é mais fácil para eu internalizar.
fonte
Vamos visualizar (você vai se lembrar sempre),
Nos pandas:
Suponha que, para executar a operação concat () no dataframe1 e dataframe2, pegaremos o dataframe1 e retiremos a primeira linha do dataframe1 e colocaremos no novo DF, em seguida, removermos outra linha do dataframe1 e colocar no novo DF, repetiremos esse processo até chegamos ao final do dataframe1. Em seguida, fazemos o mesmo processo para o dataframe2.
Basicamente, empilhe o dataframe2 em cima do dataframe1 ou vice-versa.
Por exemplo, fazer uma pilha de livros sobre uma mesa ou chão
Suponha que, para executar a operação concat () no dataframe1 e dataframe2, removeremos a 1ª coluna completa (também conhecida como 1ª série) do dataframe1 e colocaremos no novo DF, em seguida, removeremos a segunda coluna do dataframe1 e permaneceremos adjacentes (lateralmente) ) , precisamos repetir esta operação até que todas as colunas sejam concluídas. Em seguida, repetimos o mesmo processo no dataframe2. Basicamente, empilhando o dataframe2 lateralmente.
Por exemplo, organizando livros em uma estante.
fonte
axis
refere-se à dimensão da matriz, no caso depd.DataFrame
saxis=0
é a dimensão que aponta para baixo eaxis=1
a que aponta para a direita.Exemplo: Pense em um
ndarray
com forma(3,5,7)
.a
é tridimensionalndarray
, ou seja, possui 3 eixos ("eixos" é plural de "eixo"). A configuração dea
será semelhante a 3 fatias de pão, onde cada fatia é da dimensão 5 por 7.a[0,:,:]
irá se referir à fatia 0-th,a[1,:,:]
irá se referir à 1ª fatia etc.a.sum(axis=0)
será aplicadosum()
ao longo do eixo 0 dea
. Você adicionará todas as fatias e terminará com uma fatia de forma(5,7)
.a.sum(axis=0)
é equivalente ab
ea.sum(axis=0)
ambos terão esta aparênciaEm a
pd.DataFrame
, os eixos funcionam da mesma maneira que emnumpy.array
s:axis=0
será aplicadosum()
ou qualquer outra função de redução para cada coluna.NB Na resposta de @ zhangxaochen, considero as frases "ao longo das linhas" e "ao longo das colunas" um pouco confusas.
axis=0
deve se referir a "ao longo de cada coluna" eaxis=1
"ao longo de cada linha".fonte
A maneira mais fácil de entender é discutir se você está calculando uma estatística para cada coluna (
axis = 0
) ou cada linha (axis = 1
). Se você calcular uma estatística, diga uma média,axis = 0
obterá essa estatística para cada coluna. Portanto, se cada observação for uma linha e cada variável estiver em uma coluna, você obterá a média de cada variável. Se você definiraxis = 1
, calculará sua estatística para cada linha. No nosso exemplo, você obteria a média para cada observação em todas as suas variáveis (talvez você queira a média das medidas relacionadas).axis = 0
: por coluna = coluna = ao longo das linhasaxis = 1
: por linha = linha = ao longo das colunasfonte
axis=0
isso não ficamos na linha de dizer quando, digamos, calcular a média; em vez disso, percorremos todas as linhas de uma coluna.Vamos olhar para a tabela do Wiki. Esta é uma estimativa do PIB do FMI de 2010 a 2019 para os dez principais países.
1. O eixo 1 atuará para cada linha em todas as colunas
Se você deseja calcular o PIB médio (médio) para CADA países durante a década (2010-2019), é necessário fazer isso
df.mean(axis=1)
. Por exemplo, se você deseja calcular o PIB médio dos Estados Unidos de 2010 a 2019,df.loc['United States','2010':'2019'].mean(axis=1)
2. O eixo 0 atuará para cada coluna em todas as linhas.
Se eu quiser calcular o PIB médio (médio) de CADA ano para todos os países, você precisará fazer isso
df.mean(axis=0)
. Por exemplo, se você deseja calcular o PIB médio do ano de 2015 para Estados Unidos, China, Japão, Alemanha e Índia,df.loc['United States':'India','2015'].mean(axis=0)
Observação: o código acima funcionará somente após a definição da coluna "País (ou território dependente)" como Índice, usando
set_index
método.fonte
O eixo em vista da programação é a posição na tupla de forma. Aqui está um exemplo:
A média no eixo fará com que essa dimensão seja removida.
Referindo-se à pergunta original, a forma dff é (1,2). Usar o eixo = 1 mudará a forma para (1,).
fonte
O designer de pandas, Wes McKinney, costumava trabalhar intensamente em dados financeiros. Pense em colunas como nomes de ações e indexe como preços diários. Você pode adivinhar qual é o comportamento padrão (ou seja,
axis=0
) com relação a esses dados financeiros.axis=1
pode ser simplesmente pensado como "a outra direção".Por exemplo, as funções estatísticas, tais como
mean()
,sum()
,describe()
,count()
tudo padrão para a coluna-wise porque faz mais sentido fazê-los para cada ação.sort_index(by=)
O padrão também é coluna.fillna(method='ffill')
preencherá ao longo da coluna porque é o mesmo material.dropna()
o padrão é remar porque você provavelmente só quer descartar o preço naquele dia em vez de jogar fora todos os preços desse estoque.Da mesma forma, a indexação de colchetes refere-se às colunas, pois é mais comum escolher uma ação em vez de escolher um dia.
fonte
uma das maneiras fáceis de lembrar o eixo 1 (colunas) e o eixo 0 (linhas) é a saída que você espera.
fonte
pd.concat
oudf.dropna()
, que usa o eixo kewarg em mais capacidade de identificação.O problema de usar
axis=
corretamente é para seu uso em 2 casos diferentes principais:A principal idéia por trás dessa resposta é que, para evitar a confusão, selecionamos um número ou um nome para especificar o eixo específico, o que for mais claro, intuitivo e descritivo.
O Pandas é baseado no NumPy, que é baseado em matemática, particularmente em matrizes n-dimensionais. Aqui está uma imagem para uso comum dos nomes dos eixos em matemática no espaço tridimensional:
Esta figura é para memorizar apenas os números ordinais dos eixos :
0
para o eixo x,1
para o eixo y, e2
para o eixo z.O eixo z é apenas para painéis ; para quadros de dados , restringiremos nosso interesse ao plano básico bidimensional de cor verde com o eixo x (
0
vertical) e o eixo y (1
horizontal).É tudo para números como valores potenciais do
axis=
parâmetro.Os nomes dos eixos são
'index'
(você pode usar o alias'rows'
) e'columns'
, e para esta explicação , NÃO é importante a relação entre esses nomes e números ordinais (de eixos), pois todos sabem o que significam as palavras "linhas" e "colunas" ( e todos aqui - suponho - sabem o que significa a palavra "índice" nos pandas).E agora, minha recomendação:
Se você deseja calcular um valor acumulado , você pode calculá-lo a partir dos valores localizados ao longo do eixo 0 (ou ao longo do eixo 1 ) - use
axis=0
(ouaxis=1
).Da mesma forma, se você deseja reorganizar os valores , use o número do eixo ao longo do qual estão localizados os dados para reorganizar (por exemplo, para classificar ).
Se você deseja manipular (por exemplo, concatenar ) entidades (por exemplo, quadros de dados ) - use
axis='index'
(sinônimo :)axis='rows'
ouaxis='columns'
para especificar a alteração resultante - índice ( linhas ) ou colunas , respectivamente.(Para concatenar , você obterá um índice mais longo (= mais linhas) ou mais colunas , respectivamente.)
fonte
Isso é baseado na resposta de @ Safak. A melhor maneira de entender os eixos em pandas / numpy é criar uma matriz 3d e verificar o resultado da função soma ao longo dos 3 eixos diferentes.
a será:
Agora confira a soma dos elementos da matriz ao longo de cada um dos eixos:
fornecerá os seguintes resultados:
fonte
Eu entendo assim:
Digamos que se sua operação requer a movimentação da esquerda para a direita / direita para a esquerda em um dataframe, você está aparentemente mesclando colunas. você está operando em várias colunas. Este é o eixo = 1
Exemplo
Da mesma forma, se sua operação exigir a passagem de cima para baixo / baixo para cima em um quadro de dados, você estará mesclando linhas. Este é o eixo = 0 .
fonte
eixo = 0 significa para cima eixo para baixo = 1 significa da esquerda para a direita
O exemplo dado é a soma de todos os dados na coluna == chave.
fonte
Meu pensamento: Axis = n, onde n = 0, 1, etc. significa que a matriz está recolhida (dobrada) ao longo desse eixo. Portanto, em uma matriz 2D, quando você recolhe ao longo de 0 (linhas), você está realmente operando em uma coluna por vez. Da mesma forma para matrizes de ordem superior.
Isso não é o mesmo que a referência normal a uma dimensão em uma matriz, onde 0 -> linha e 1 -> coluna. Da mesma forma para outras dimensões em uma matriz de dimensão N.
fonte
Eu sou um novato em pandas. Mas é assim que eu entendo o eixo nos pandas:
Direção variável constante do eixo
0 Linha da coluna para baixo |
Coluna de 1 linha à direita ->
Portanto, para calcular a média de uma coluna, essa coluna específica deve ser constante, mas as linhas abaixo disso podem mudar (variando), de modo que seja eixo = 0.
Da mesma forma, para calcular a média de uma linha, essa linha específica é constante, mas pode percorrer colunas diferentes (variadas) , eixo = 1.
fonte
Eu acho que existe uma outra maneira de entender isso.
Para uma matriz np, se queremos eliminar colunas, usamos o eixo = 1; se queremos eliminar linhas, usamos o eixo = 0.
Para o objeto pandas,
axis = 0
significa operação em linha eaxis = 1
significa operação em coluna. Isso é diferente denumpy
por definição, podemos verificar as definições de numpy.doc e pandas.docfonte
Evitarei explicitamente o uso de 'linha' ou 'ao longo das colunas', pois as pessoas podem interpretá-las exatamente da maneira errada.
Analogia primeiro. Intuitivamente, você esperaria que
pandas.DataFrame.drop(axis='column')
elimine uma coluna de N colunas e forneça (N - 1) colunas. Portanto, você não deve prestar atenção às linhas por enquanto (e remova a palavra 'linha' do seu dicionário de inglês). Vice-versa,drop(axis='row')
funciona em linhas.Da mesma forma,
sum(axis='column')
funciona em várias colunas e fornece uma coluna. Similarmente,sum(axis='row')
resulta em 1 linha. Isso é consistente com sua forma mais simples de definição, reduzindo uma lista de números para um único número.Em geral, com
axis=column
, você vê colunas, trabalha em colunas e obtém colunas. Esqueça as linhas.Com
axis=row
, mude a perspectiva e trabalhe nas linhas.0 e 1 são apenas aliases para 'linha' e 'coluna'. É a convenção da indexação matricial.
fonte
pd.concat
sua explicação, isso não funciona. Você poderia explicar o comportamento da concat com os 2 eixos, por favor? Obrigado.Eu tenho tentado descobrir o eixo pela última hora também. O idioma em todas as respostas acima e também a documentação não são de todo úteis.
Para responder à pergunta como eu a entendo agora, no Pandas, eixo = 1 ou 0 significa quais cabeçalhos de eixo você deseja manter constante ao aplicar a função.
Nota: Quando digo cabeçalhos, quero dizer nomes de índice
Expandindo seu exemplo:
Para eixo = 1 = colunas: mantemos os cabeçalhos das colunas constantes e aplicamos a função média alterando os dados. Para demonstrar, mantemos os cabeçalhos das colunas constantes como:
Agora, preenchemos um conjunto de valores A e B e, em seguida, encontramos a média
Em seguida, preenchemos o próximo conjunto de valores A e B e encontramos a média
Da mesma forma, para eixos = linhas, mantemos os cabeçalhos das linhas constantes e alteramos os dados: Para demonstrar, primeiro corrija os cabeçalhos das linhas:
Agora preencha o primeiro conjunto de valores X e Y e encontre a média
Em seguida, preencha o próximo conjunto de valores X e Y e encontre a média:
Em suma,
Quando eixo = colunas, você fixa os cabeçalhos das colunas e altera os dados, que virão das diferentes linhas.
Quando eixo = linhas, você fixa os cabeçalhos das linhas e altera os dados, que virão das diferentes colunas.
fonte
axis = 1, dará a soma da linha sábia, keepdims = True manterá a dimensão 2D. Espero que ajude você.
fonte
Muitas respostas aqui me ajudaram muito!
Caso você fique confuso com os diferentes comportamentos do
axis
Python eMARGIN
do R (como naapply
função), você pode encontrar uma postagem de blog que escrevi de interesse: https://accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html .Em essência:
numpy
epandas
, o parâmetro do eixo na soma na verdade especifica numpy para calcular a média de todos os valores que podem ser buscados na forma de matriz [0, 0, ..., i, ..., 0] onde itera através de todos os valores possíveis. O processo é repetido com a posição de i fixa e os índices de outras dimensões variam um após o outro (do elemento mais à direita). O resultado é uma matriz n-1-dimensional.apply
função calcule a média de todos os valores que podem ser buscados na forma de matriz [, ..., i, ...,] onde itera todos os valores possíveis. O processo não é repetido quando todos os valores de i foram iterados. Portanto, o resultado é um vetor simples.fonte
As matrizes são projetadas com o chamado eixo = 0 e as linhas posicionadas verticalmente versus o eixo = 1 e as colunas posicionadas horizontalmente. Eixo refere-se à dimensão da matriz.
fonte
axis=0
significa cada linha como um lote, só podemos manipular DataFrame entre linhas em vez de linha interna.axis=1
significa cada coluna como um volume, só podemos manipular a inter-coluna do DataFrame em vez da coluna interna.