Você pode me dizer quando usar esses métodos de vetorização com exemplos básicos?
Vejo que map
é um Series
método, enquanto o resto são DataFrame
métodos. Fiquei confuso sobre apply
e applymap
métodos embora. Por que temos dois métodos para aplicar uma função a um DataFrame? Novamente, exemplos simples que ilustram o uso seriam ótimos!
python
pandas
dataframe
vectorization
marillion
fonte
fonte
Respostas:
Direto do livro Python for Data Analysis de Wes McKinney , pág. 132 (recomendo vivamente este livro):
Resumindo,
apply
funciona em uma linha / coluna de um DataFrame,applymap
funciona em elementos em um DataFrame emap
funciona em elementos em uma Série.fonte
func
alambda x: [func(y) for y in x]
, e aplicando coluna-wise)map
eapplymap
ambos funcionam em elementos, eu esperaria um único método (oumap
ouapplymap
) que funcionasse tanto para uma série quanto para um DataFrame. Provavelmente existem outras considerações de design, e Wes McKinney decidiu criar dois métodos diferentes.applymap
com agroupby
função nos pandas?Comparando
map
,applymap
e : O contexto importaap
ply
Primeira grande diferença: DEFINIÇÃO
map
é definido apenas na sérieapplymap
é definido apenas nos DataFramesapply
é definido em AMBOSSegunda grande diferença: ARGUMENTO DE ENTRADA
map
aceitadict
sSeries
ouapplymap
eapply
aceitar apenas callablesTerceira grande diferença: COMPORTAMENTO
map
é elementar para Seriesapplymap
é elementwise para DataFramesapply
também funciona de maneira elementar, mas é adequado para operações e agregações mais complexas. O comportamento e o valor de retorno dependem da função.Quarta maior diferença (a mais importante): USE CASE
map
destina-se ao mapeamento de valores de um domínio para outro, portanto, é otimizado para desempenho (por exemplo,df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
é bom para transformações elementares em várias linhas / colunas (por exemplo,df[['A', 'B', 'C']].applymap(str.strip)
)apply
é para aplicar qualquer função que não possa ser vetorizada (por exemplo,df['sentences'].apply(nltk.sent_tokenize)
)Resumindo
fonte
Há ótimas informações nessas respostas, mas estou adicionando as minhas para resumir claramente quais métodos funcionam em matriz versus elemento. jeremiahbuddha fez isso principalmente, mas não mencionou Series.apply. Eu não tenho o representante para comentar.
DataFrame.apply
opera em linhas ou colunas inteiras de cada vez.DataFrame.applymap
,Series.apply
ESeries.map
operar em um elemento de tempo.Há muita sobreposição entre os recursos de
Series.apply
eSeries.map
, o que significa que qualquer um deles funcionará na maioria dos casos. Eles têm algumas pequenas diferenças, algumas das quais foram discutidas na resposta da osa.fonte
Adicionando às outras respostas, em um
Series
também há mapa e aplicação .O Apply pode criar um DataFrame de uma série ; no entanto, o mapa apenas colocará uma série em todas as células de outra série, o que provavelmente não é o que você deseja.
Além disso, se eu tivesse uma função com efeitos colaterais, como "conectar-se a um servidor web", provavelmente usaria
apply
apenas por uma questão de clareza.Map
pode usar não apenas uma função, mas também um dicionário ou outra série. Digamos que você queira manipular permutações .Toma
O quadrado dessa permutação é
Você pode calcular usando
map
. Não tenho certeza se a auto-aplicação está documentada, mas funciona0.15.1
.fonte
O @jeremiahbuddha mencionou que o apply funciona em linhas / colunas, enquanto o applymap funciona em elementos. Mas parece que você ainda pode usar o aplicativo para computação por elementos ....
fonte
Só queria ressaltar, porque lutei um pouco com isso
isso não modifica o próprio quadro de dados, deve ser reatribuído
fonte
df = modified_df
ou se você definirinplace=True
sinalizador. Também trama de dados vai mudar se você passar uma trama de dados a uma função por referência e as modifica função da trama de dados.ix
ou.where
etc. Não sabe ao certo qual é a explicação completa quando você precisa mudar a atribuição e quando não.Explicação provavelmente mais simples, a diferença entre apply e applymap:
Apply pega a coluna inteira como um parâmetro e, em seguida, atribua o resultado a esta coluna
applymap usa o valor da célula separado como parâmetro e atribua o resultado novamente a essa célula.
Nota: Se aplicar retorna o valor único, você terá esse valor em vez da coluna após a atribuição e, eventualmente, terá apenas uma linha em vez de matriz.
fonte
Meu entendimento:
Do ponto de vista da função:
Se a função tiver variáveis que precisam ser comparadas em uma coluna / linha, use
apply
.por exemplo:
lambda x: x.max()-x.mean()
.Se a função deve ser aplicada a cada elemento:
1> Se uma coluna / linha estiver localizada, use
apply
2> Se aplicável a todo o quadro de dados, use
applymap
fonte
Com base na resposta de cs95
map
é definido apenas na sérieapplymap
é definido apenas nos DataFramesapply
é definido em AMBOSdê alguns exemplos
fonte
FOMO:
O exemplo a seguir mostra
apply
eapplymap
aplicado a umDataFrame
.map
função é algo que você aplica apenas na série. Você não pode aplicarmap
no DataFrame.É importante lembrar que
apply
pode fazer tudo o queapplymap
puder, masapply
tem opções eXtra .As opções do fator X são:
axis
eresult_type
onderesult_type
só funciona quandoaxis=1
(para colunas).Como nota de rodapé, a
map
função Series , não deve ser confundida com amap
função Python .O primeiro é aplicado em Série, para mapear os valores, e o segundo para cada item de um iterável.
Por fim, não confunda o
apply
método dataframe com oapply
método groupby .fonte