python - Pandas: ¿Cómo puedo usar la función apply() para una sola columna?
dataframe python-3.5 (4)
Tengo un marco de datos de pandas con dos columnas. Necesito cambiar los valores de la primera columna sin afectar la segunda y recuperar todo el marco de datos con solo los valores de la primera columna cambiados. ¿Cómo puedo hacer eso usando aplicar en pandas?
Aunque las respuestas dadas son correctas, modifican el marco de datos inicial, lo que no siempre es deseable (y, dado que el OP solicitó ejemplos "usando
apply
", podría ser que quisieran una versión que devuelva un nuevo marco de datos, como
apply
)
Esto es posible mediante la
assign
: es válido
assign
a columnas existentes, como dice la documentación (el énfasis es mío):
Asignar nuevas columnas a un DataFrame.
Devuelve un nuevo objeto con todas las columnas originales además de las nuevas. Las columnas existentes que se reasignan se sobrescribirán .
En breve:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([{''a'': 15, ''b'': 15, ''c'': 5}, {''a'': 20, ''b'': 10, ''c'': 7}, {''a'': 25, ''b'': 30, ''c'': 9}])
In [3]: df.assign(a=lambda df: df.a / 2)
Out[3]:
a b c
0 7.5 15 5
1 10.0 10 7
2 12.5 30 9
In [4]: df
Out[4]:
a b c
0 15 15 5
1 20 10 7
2 25 30 9
Tenga en cuenta que la función pasará todo el marco de datos, no solo la columna que desea modificar, por lo que deberá asegurarse de seleccionar la columna correcta en su lambda.
Dado un marco de datos de muestra
df
como:
a,b
1,2
2,3
3,4
4,5
lo que quieres es:
df[''a''] = df[''a''].apply(lambda x: x + 1)
eso devuelve:
a b
0 2 2
1 3 3
2 4 4
3 5 5
No necesitas una función en absoluto. Puede trabajar en una columna completa directamente.
Datos de ejemplo:
>>> df = pd.DataFrame({''a'': [100, 1000], ''b'': [200, 2000], ''c'': [300, 3000]})
>>> df
a b c
0 100 200 300
1 1000 2000 3000
La mitad de todos los valores en la columna
a
:
>>> df.a = df.a / 2
>>> df
a b c
0 50 200 300
1 500 2000 3000
Para una sola columna mejor usar
map()
, así:
df = pd.DataFrame([{''a'': 15, ''b'': 15, ''c'': 5}, {''a'': 20, ''b'': 10, ''c'': 7}, {''a'': 25, ''b'': 30, ''c'': 9}])
a b c
0 15 15 5
1 20 10 7
2 25 30 9
df[''a''] = df[''a''].map(lambda a: a / 2.)
a b c
0 7.5 15 5
1 10.0 10 7
2 12.5 30 9