El siguiente código no funciona.
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x.lower())
¿Cómo debo modificarlo para obtener xLower = ['one', 'two', np.nan]? La eficiencia es importante ya que el marco de datos real es enorme.
python
string
pandas
missing-data
P. Escondido
fuente
fuente

str.casefoldpara comparaciones de cuerdas plegables más agresivas. Más información en esta respuesta .Respuestas:
utilizar métodos de cadena vectorizados de pandas ; como en la documentación:
.str.lower()es el primer ejemplo allí;>>> df['x'].str.lower() 0 one 1 two 2 NaN Name: x, dtype: objectfuente
10000 loops, best of 3: 96.4 µs per loop10000 loops, best of 3: 125 µs per loopOtra posible solución, en caso de que la columna no solo tenga cadenas sino también números, es usar
astype(str).str.lower()oto_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: objecty no
>>> xLower 0 one 1 two 2 NaN 3 NaN Name: x, dtype: objecteditar:
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)fuente
Una posible solución:
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower()) print (xLower)Y un resultado:
0 one 1 two 2 NaN Name: x, dtype: objectSin embargo, no estoy seguro de la eficiencia.
fuente
isinstancepara verificar el tipo de un objeto.también puedes probar este,
df= df.applymap(lambda s:s.lower() if type(s) == str else s)fuente
type(s) == stren su lugar debería serisinstance(s, str)Pandas> = 0.25: Elimina las distinciones de mayúsculas y minúsculas con
str.casefoldA partir de la versión 0.25, recomiendo usar el método de cadena "vectorizada"
str.casefoldsi se trata de datos unicode (funciona independientemente de la cadena o unicodes):s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe']) s.str.casefold() 0 lower 1 capitals 2 NaN 3 swapcase dtype: objectConsulte también el problema relacionado con GitHub GH25405 .
casefoldse presta a una comparación más agresiva de plegado de cajas. También maneja los NaN con elegancia (al igual que lostr.lowerhace).Pero, ¿por qué es esto mejor?
La diferencia se ve con Unicodes. Tomando el ejemplo en los documentos de Python
str.casefold,Compare la salida de
lowerpara,s = pd.Series(["der Fluß"]) s.str.lower() 0 der fluß dtype: objectVersus
casefold,s.str.casefold() 0 der fluss dtype: objectTambién vea Python: lower () vs casefold () en la coincidencia de cadenas y la conversión a minúsculas .
fuente
Puede estar usando la comprensión de listas
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']}) df['Name'] = [str(i).lower() for i in df['Name']] print(df)fuente
Aplicar la función lambda
df['original_category'] = df['original_category'].apply(lambda x:x.lower())fuente
Utilice la función de aplicación,
Xlower = df['x'].apply(lambda x: x.upper()).head(10)fuente
(Efficiency is important since the real data frame is huge.)y hay algunas respuestas más, intente exponer cuál es el buen punto de su respuesta.copie su columna Dataframe y simplemente aplique
df=data['x'] newdf=df.str.lower()fuente