Otra posible solución, en caso de que la columna no solo tenga cadenas sino también números, es usar astype(str).str.lower()
o to_string(na_rep='')
porque de lo contrario, dado que un número no es una cadena, al bajarlo retornará NaN
, por lo tanto:
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x'])
xSecureLower = df['x'].to_string(na_rep='').lower()
xLower = df['x'].str.lower()
entonces tenemos:
>>> xSecureLower
0 one
1 two
2
3 2
Name: x, dtype: object
y no
>>> xLower
0 one
1 two
2 NaN
3 NaN
Name: x, dtype: object
editar:
si no desea perder los NaN, entonces usar el mapa será mejor, (de @ wojciech-walczak y @ cs95 comment) se verá así
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
str.casefold
para comparaciones de cuerdas plegables más agresivas. Más información en esta respuesta .