Python: Pandas filtra datos de cadena en función de su longitud de cadena

Me gusta filtrar los datos cuya longitud de cadena no es igual a 10.

Si trato de filtrar cualquier fila cuya longitud de cadena de la columna A o B no sea igual a 10, lo intenté.

df=pd.read_csv('filex.csv') df.A=df.A.apply(lambda x: x if len(x)== 10 else np.nan) df.B=df.B.apply(lambda x: x if len(x)== 10 else np.nan) df=df.dropna(subset=['A','B'], how='any') 

Esto funciona lento, pero está funcionando.

Sin embargo, a veces produce un error cuando los datos en A no son una cadena sino un número (interpretado como un número cuando read_csv lee el archivo de entrada).

  File "", line 1, in  TypeError: object of type 'float' has no len() 

Creo que debería haber un código más eficiente y elegante en lugar de esto.

 import pandas as pd df = pd.read_csv('filex.csv') df['A'] = df['A'].astype('str') df['B'] = df['B'].astype('str') mask = (df['A'].str.len() == 10) & (df['B'].str.len() == 10) df = df.loc[mask] print(df) 

Aplicado a filex.csv:

 A,B 123,abc 1234,abcd 1234567890,abcdefghij 

el código de arriba imprime

  AB 2 1234567890 abcdefghij 

Una forma más Pythonic de filtrar filas según las condiciones dadas de otras columnas y sus valores:

Suponiendo un df de:

 data={"names":["Alice","Zac","Anna","O"],"cars":["Civic","BMW","Mitsubishi","Benz"], "age":["1","4","2","0"]} df=pd.DataFrame(data) df: age cars names 0 1 Civic Alice 1 4 BMW Zac 2 2 Mitsubishi Anna 3 0 Benz O 

Entonces:

 df[ df['names'].apply(lambda x: len(x)>1) & df['cars'].apply(lambda x: "i" in x) & df['age'].apply(lambda x: int(x)<2) ] 

Tendremos :

  age cars names 0 1 Civic Alice 

En las condiciones anteriores, primero observamos la longitud de las cadenas, luego verificamos si existe una letra ("i") en las cadenas o no, finalmente, verificamos el valor de los números enteros en la primera columna.

Si tienes números en filas, se convertirán como flotantes.

Convierta todas las filas en cadenas después de importar desde cvs. Para un mejor rendimiento, divida las lambdas en múltiples hilos.

Puedes usar df.apply(len) . te dará el resultado