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.casefold
para 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: object
fuente
10000 loops, best of 3: 96.4 µs per loop
10000 loops, best of 3: 125 µs per loop
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()
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: 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)
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: object
Sin embargo, no estoy seguro de la eficiencia.
fuente
isinstance
para 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) == str
en su lugar debería serisinstance(s, str)
Pandas> = 0.25: Elimina las distinciones de mayúsculas y minúsculas con
str.casefold
A partir de la versión 0.25, recomiendo usar el método de cadena "vectorizada"
str.casefold
si 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: object
Consulte también el problema relacionado con GitHub GH25405 .
casefold
se presta a una comparación más agresiva de plegado de cajas. También maneja los NaN con elegancia (al igual que lostr.lower
hace).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
lower
para,s = pd.Series(["der Fluß"]) s.str.lower() 0 der fluß dtype: object
Versus
casefold
,s.str.casefold() 0 der fluss dtype: object
Tambié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