¿Me puede decir cuándo usar estos métodos de vectorización con ejemplos básicos?
Veo que map
es un Series
método, mientras que el resto son DataFrame
métodos. Sin embargo, me confundí apply
y los applymap
métodos. ¿Por qué tenemos dos métodos para aplicar una función a un DataFrame? Una vez más, ¡ejemplos simples que ilustran el uso serían geniales!
python
pandas
dataframe
vectorization
marillion
fuente
fuente
Respuestas:
Directamente del libro Python for Data Analysis de Wes McKinney , pág. 132 (Recomiendo este libro):
En resumen,
apply
funciona en una fila / columna de un DataFrame,applymap
funciona por elementos en un DataFrame y pormap
elementos en una Serie.fuente
func
alambda x: [func(y) for y in x]
, y aplicando por columnas)map
yapplymap
tanto elemento a elemento de trabajo, que se puede esperar de un único método (ya seamap
oapplymap
) que trabajaría tanto para una serie y una trama de datos. Probablemente hay otras consideraciones de diseño, y Wes McKinney decidió proponer dos métodos diferentes.applymap
junto con lagroupby
función en los pandas?Comparar
map
,applymap
y : El contexto es importanteap
ply
Primera diferencia importante: DEFINICIÓN
map
se define SOLO en la serieapplymap
se define SOLAMENTE en DataFramesapply
se define en AMBOSSegunda diferencia importante: ARGUMENTO DE ENTRADA
map
aceptadict
sSeries
, o invocableapplymap
yapply
acepta solo callablesTercera gran diferencia: COMPORTAMIENTO
map
es elementwise para Seriesapplymap
es elementwise para DataFramesapply
también funciona en elementos pero es adecuado para operaciones y agregaciones más complejas. El comportamiento y el valor de retorno dependen de la función.Cuarta diferencia importante (la más importante): CASO DE USO
map
está destinado a asignar valores de un dominio a otro, por lo que está optimizado para el rendimiento (por ejemplo,df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
es bueno para transformaciones de elementos a través de múltiples filas / columnas (por ejemplo,df[['A', 'B', 'C']].applymap(str.strip)
)apply
es para aplicar cualquier función que no se pueda vectorizar (por ejemplo,df['sentences'].apply(nltk.sent_tokenize)
)Resumiendo
fuente
Hay gran información en estas respuestas, pero estoy agregando la mía para resumir claramente qué métodos funcionan en forma de matriz versus en función de elemento. jeremiahbuddha hizo esto principalmente, pero no mencionó Series.apply. No tengo el representante para comentar.
DataFrame.apply
opera en filas o columnas enteras a la vez.DataFrame.applymap
,Series.apply
ySeries.map
operar en un elemento a la vez.Hay mucha superposición entre las capacidades de
Series.apply
ySeries.map
, lo que significa que cualquiera de los dos funcionará en la mayoría de los casos. Sin embargo, tienen algunas pequeñas diferencias, algunas de las cuales se discutieron en la respuesta de osa.fuente
Agregando a las otras respuestas, en un
Series
también hay un mapa y aplicar .Apply puede hacer un DataFrame de una serie ; sin embargo, map solo colocará una serie en cada celda de otra serie, lo que probablemente no sea lo que desea.
Además, si tuviera una función con efectos secundarios, como "conectarse a un servidor web", probablemente la usaría
apply
solo por razones de claridad.Map
puede usar no solo una función, sino también un diccionario u otra serie. Digamos que quieres manipular permutaciones .Tomar
El cuadrado de esta permutación es
Puedes calcularlo usando
map
. No estoy seguro de si la autoaplicación está documentada, pero funciona0.15.1
.fuente
@jeremiahbuddha mencionó que apply funciona en filas / columnas, mientras que applymap funciona por elementos. Pero parece que todavía puede usar el método de cálculo basado en elementos ...
fuente
Solo quería señalar, mientras luchaba con esto por un momento
esto no modifica el marco de datos en sí, debe reasignarse
fuente
df = modified_df
o si establece la marcainplace=True
. También el marco de datos cambiará si pasa un marco de datos a una función por referencia y la función modifica el marco de datos.ix
o.where
etc. No estoy seguro de cuál es la explicación completa para cuándo necesita reasignar y cuándo no.Probablemente la explicación más simple es la diferencia entre apply y applymap:
apply toma la columna completa como parámetro y luego asigna el resultado a esta columna
applymap toma el valor de la celda separada como parámetro y asigna el resultado a esta celda.
Nota: si apply devuelve el valor único, tendrá este valor en lugar de la columna después de la asignación y, finalmente, tendrá solo una fila en lugar de una matriz.
fuente
Mi punto de vista:
Desde el punto de vista de la función:
Si la función tiene variables que deben compararse dentro de una columna / fila, use
apply
.por ejemplo:
lambda x: x.max()-x.mean()
.Si la función se aplica a cada elemento:
1> Si se encuentra una columna / fila, use
apply
2> Si se aplica a todo el marco de datos, use
applymap
fuente
Basado en la respuesta de cs95
map
se define SOLO en la serieapplymap
se define SOLAMENTE en DataFramesapply
se define en AMBOSda algunos ejemplos
fuente
FOMO:
El siguiente ejemplo muestra
apply
y seapplymap
aplica a aDataFrame
.map
La función es algo que aplica solo en la serie. No puede aplicarmap
en DataFrame.Lo que hay que recordar es que
apply
puede hacer cualquier cosaapplymap
, peroapply
tiene opciones eXtra .Las opciones del factor X son:
axis
yresult_type
donderesult_type
solo funciona cuandoaxis=1
(para columnas).Como nota al margen, la
map
función Serie no debe confundirse con lamap
función Python .El primero se aplica en Series, para asignar los valores, y el segundo a cada elemento de un iterable.
Por último, no confunda el
apply
método del marco de datos con groupbyapply
método .fuente