Me gustaría agregar una cadena al inicio de cada valor en dicha columna de un marco de datos de pandas (elegantemente). Ya descubrí cómo hacer esto y actualmente estoy usando:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Esto parece una cosa increíblemente poco elegante, ¿conoce alguna otra forma (que tal vez también agregue el carácter a las filas donde esa columna es 0 o NaN)?
En caso de que esto aún no esté claro, me gustaría convertir:
col
1 a
2 0
dentro:
col
1 stra
2 str0
!= False
negocio? ¿Quieres agregarstr
a todos los valores o solo a algunos?df['col'] = 'str' + df['col'].astype(str)
?Respuestas:
Ejemplo:
fuente
Como alternativa, también puede usar un
apply
combinado conformat
(o mejor con f-strings) que encuentro un poco más legible si uno, por ejemplo, también quiere agregar un sufijo o manipular el elemento en sí:que también produce el resultado deseado:
Si está usando Python 3.6+, también puede usar f-strings:
dando el mismo resultado.
La versión de f-string es casi tan rápida como la solución de @ RomanPekar (python 3.6.4):
El uso
format
, sin embargo, es de hecho mucho más lento:fuente
format
de hecho funciona peor. ¿Cómo te comparaste?.apply
es siempre tan rápido o más lento que las operaciones vectorizadas "directas"; incluso si no son más lentos, prefiero evitarlos siempre que sea posible.x
mismo, etc., pero eso es solo una cuestión de gustos ... :)Puede usar pandas.Series.map:
Aplicará la palabra "str" antes de todos sus valores.
fuente
Si carga su archivo de tabla con
dtype=str
o convierte el tipo de columna a cadena
df['a'] = df['a'].astype(str)
, puede usar dicho enfoque:
Este enfoque permite anteponer, agregar y subconjuntar cadenas de
df
.Funciona en Pandas v0.23.4, v0.24.1. No conozco versiones anteriores.
fuente
Otra solución con .loc:
Esto no es tan rápido como las soluciones anteriores (> 1 ms por ciclo más lento) pero puede ser útil en caso de que necesite un cambio condicional, como:
fuente
.index
endf[mask].index
?df.loc[mask]
funciona, y lo hace, entonces.index
es superfluo, ¿verdad?