¿Me puede decir cuándo usar estos métodos de vectorización con ejemplos básicos?
Veo que mapes un Seriesmétodo, mientras que el resto son DataFramemétodos. Sin embargo, me confundí applyy los applymapmé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,
applyfunciona en una fila / columna de un DataFrame,applymapfunciona por elementos en un DataFrame y pormapelementos en una Serie.fuente
funcalambda x: [func(y) for y in x], y aplicando por columnas)mapyapplymaptanto elemento a elemento de trabajo, que se puede esperar de un único método (ya seamapoapplymap) 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.applymapjunto con lagroupbyfunción en los pandas?Comparar
map,applymapy : El contexto es importanteapplyPrimera diferencia importante: DEFINICIÓN
mapse define SOLO en la serieapplymapse define SOLAMENTE en DataFramesapplyse define en AMBOSSegunda diferencia importante: ARGUMENTO DE ENTRADA
mapaceptadictsSeries, o invocableapplymapyapplyacepta solo callablesTercera gran diferencia: COMPORTAMIENTO
mapes elementwise para Seriesapplymapes elementwise para DataFramesapplytambié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
mapestá 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'}))applymapes bueno para transformaciones de elementos a través de múltiples filas / columnas (por ejemplo,df[['A', 'B', 'C']].applymap(str.strip))applyes 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.applyopera en filas o columnas enteras a la vez.DataFrame.applymap,Series.applyySeries.mapoperar en un elemento a la vez.Hay mucha superposición entre las capacidades de
Series.applyySeries.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
Seriestambié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
applysolo por razones de claridad.Mappuede 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_dfo 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.ixo.whereetc. 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
apply2> Si se aplica a todo el marco de datos, use
applymapfuente
Basado en la respuesta de cs95
mapse define SOLO en la serieapplymapse define SOLAMENTE en DataFramesapplyse define en AMBOSda algunos ejemplos
fuente
FOMO:
El siguiente ejemplo muestra
applyy seapplymapaplica a aDataFrame.mapLa función es algo que aplica solo en la serie. No puede aplicarmapen DataFrame.Lo que hay que recordar es que
applypuede hacer cualquier cosaapplymap, peroapplytiene opciones eXtra .Las opciones del factor X son:
axisyresult_typedonderesult_typesolo funciona cuandoaxis=1(para columnas).Como nota al margen, la
mapfunción Serie no debe confundirse con lamapfunció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
applymétodo del marco de datos con groupbyapplymétodo .fuente