python - tablas - Diferencia entre mapa, mapa de aplicación y métodos de aplicación en Pandas
pandas python tutorial español pdf (8)
@jeremiahbuddha mencionó que aplicar trabajos en filas / columnas, mientras que applymap funciona de forma elemental. Pero parece que todavía puedes usar aplicar para el cálculo de elementos ...
frame.apply(np.sqrt)
Out[102]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
frame.applymap(np.sqrt)
Out[103]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
¿Me puede decir cuándo usar estos métodos de vectorización con ejemplos básicos?
Veo que el map
es un método en Series
, mientras que el resto son métodos DataFrame
. Aunque me confundí acerca de los métodos de apply
y apply
applymap
. ¿Por qué tenemos dos métodos para aplicar una función a un DataFrame? ¡Nuevamente, ejemplos simples que ilustran el uso serían geniales!
Agregando a las otras respuestas, en una Series
también hay map y apply .
Aplicar puede hacer un DataFrame fuera de una serie ; Sin embargo, el mapa solo colocará una serie en cada celda de otra serie, lo que probablemente no sea lo que quieres.
In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0 1
1 2
2 3
dtype: int64
In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]:
0 1
0 1 1
1 2 2
2 3 3
In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]:
0 0 1
1 1
dtype: int64
1 0 2
1 2
dtype: int64
2 0 3
1 3
dtype: int64
dtype: object
Además, si tuviera una función con efectos secundarios, como "conectarse a un servidor web", probablemente usaría " apply
solo por motivos de claridad.
series.apply(download_file_for_every_element)
Map
puede usar no solo una función, sino también un diccionario u otra serie. Digamos que quieres manipular las permutations .
Tomar
1 2 3 4 5
2 1 4 5 3
El cuadrado de esta permutación es
1 2 3 4 5
1 2 5 3 4
Puedes calcularlo usando el map
. No estoy seguro si la auto-solicitud está documentada, pero funciona en 0.15.1
.
In [39]: p=pd.Series([1,0,3,4,2])
In [40]: p.map(p)
Out[40]:
0 0
1 1
2 4
3 2
4 3
dtype: int64
Directamente de Python para el análisis de datos de Wes McKinney, pág. 132 (Recomiendo este libro):
Otra operación frecuente es aplicar una función en matrices 1D a cada columna o fila. El método de aplicación de DataFrame hace exactamente esto:
In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list(''bde''), index=[''Utah'', ''Ohio'', ''Texas'', ''Oregon''])
In [117]: frame
Out[117]:
b d e
Utah -0.029638 1.081563 1.280300
Ohio 0.647747 0.831136 -1.549481
Texas 0.513416 -0.884417 0.195343
Oregon -0.485454 -0.477388 -0.309548
In [118]: f = lambda x: x.max() - x.min()
In [119]: frame.apply(f)
Out[119]:
b 1.133201
d 1.965980
e 2.829781
dtype: float64
Muchas de las estadísticas de matrices más comunes (como suma y media) son métodos DataFrame, por lo que no es necesario usar apply.
También se pueden usar funciones de Python en cuanto a elementos. Supongamos que desea calcular una cadena con formato de cada valor de punto flotante en el marco. Puedes hacer esto con applymap:
In [120]: format = lambda x: ''%.2f'' % x
In [121]: frame.applymap(format)
Out[121]:
b d e
Utah -0.03 1.08 1.28
Ohio 0.65 0.83 -1.55
Texas 0.51 -0.88 0.20
Oregon -0.49 -0.48 -0.31
La razón para el nombre applymap es que Series tiene un método de mapa para aplicar una función de elementos:
In [122]: frame[''e''].map(format)
Out[122]:
Utah 1.28
Ohio -1.55
Texas 0.20
Oregon -0.31
Name: e, dtype: object
En resumen, apply
trabajos en base a una fila / columna de un DataFrame, applymap
funciona de manera elemental en un DataFrame, y el map
funciona de manera elemental en una Serie.
Hay una gran información en estas respuestas, pero estoy agregando la mía para resumir con claridad qué métodos funcionan de forma inteligente en comparación con los elementos. jeremiahbuddha en su mayoría hizo esto pero no mencionó Series.apply. No tengo el representante para comentar.
DataFrame.apply
opera en filas o columnas completas a la vez.DataFrame.applymap
,Series.apply
ySeries.map
operan en un elemento a la vez.
Existe una gran cantidad de superposición entre las capacidades de Series.apply
y Series.map
, lo que significa que cualquiera de los dos funcionará en la mayoría de los casos. Sin embargo, tienen algunas diferencias leves, algunas de las cuales fueron discutidas en la respuesta de osa.
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 localiza una columna / fila, use apply
2> Si se aplica a todo el marco de datos, use applymap
majority = lambda x : x > 17
df2[''legal_drinker''] = df2[''age''].apply(majority)
def times10(x):
if type(x) is int:
x *= 10
return x
df2.applymap(times10)
Probablemente la explicación más simple es la diferencia entre Apply y ApplyMap:
aplicar toma la columna completa como un parámetro y luego asigna el resultado a esta columna
applymap toma el valor de la celda por separado como un parámetro y asigna el resultado a esta celda.
NB Si aplicar 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.
Sólo quería señalar, ya que luché con esto por un poco
def f(x):
if x < 0:
x = 0
elif x > 100000:
x = 100000
return x
df.applymap(f)
df.describe()
Esto no modifica el propio marco de datos, tiene que ser reasignado.
df = df.applymap(f)
df.describe()
Mapa: itera sobre cada elemento de una serie.
df[‘column1’].map(lambda x: 10+x),
esto agregará 10 a cada elemento de column1.
df[‘column2’].map(lambda x: ‘AV’+x),
esto concatenará "AV" al principio de cada elemento de la columna 2 (el formato de la columna es una cadena).
Aplicar: como su nombre indica, aplica una función a lo largo de cualquier eje del marco de datos.
df[[‘column1’,’column2’]].apply(sum),
devolverá la suma de todos los valores de column1 y column2.
ApplyMap: esto ayuda a aplicar una función a cada elemento del marco de datos.
func = lambda x: x+2
df.applymap(func),
agregará 2 a cada elemento de dataframe (todas las columnas de dataframe deben ser de tipo numérico)
fuente: mapa en pandas