Innym możliwym rozwiązaniem, w przypadku gdy kolumna zawiera nie tylko łańcuchy, ale także liczby, jest użycie astype(str).str.lower()
lub to_string(na_rep='')
ponieważ w przeciwnym razie, biorąc pod uwagę, że liczba nie jest łańcuchem, po obniżeniu zwróci NaN
, dlatego:
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()
potem będzie:
>>> xSecureLower
0 one
1 two
2
3 2
Name: x, dtype: object
i nie
>>> xLower
0 one
1 two
2 NaN
3 NaN
Name: x, dtype: object
edytować:
jeśli nie chcesz zgubić NaNów, to lepiej będzie używać mapy (od @ wojciech-walczak i komentarza @ cs95) będzie wyglądać mniej więcej tak
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
str.casefold
bardziej agresywne porównania ciągów ze składaniem wielkości liter. Więcej informacji w tej odpowiedzi .