Agregue ceros a las cadenas en el dataframe de Pandas

Tengo un dataframe de pandas donde las primeras 3 columnas son cadenas:

ID text1 text 2 0 2345656 blah blah 1 3456 blah blah 2 541304 blah blah 3 201306 hi blah 4 12313201308 hello blah 

Quiero añadir ceros a la ID:

  ID text1 text 2 0 000000002345656 blah blah 1 000000000003456 blah blah 2 000000000541304 blah blah 3 000000000201306 hi blah 4 000012313201308 hello blah 

Yo he tratado:

 df['ID'] = df.ID.zfill(15) df['ID'] = '{0:0>15}'.format(df['ID']) 

Tratar:

 df['ID'] = df['ID'].apply(lambda x: '{0:0>15}'.format(x)) 

o incluso

 df['ID'] = df['ID'].apply(lambda x: x.zfill(15)) 

str atributo str contiene la mayoría de los métodos en cadena.

 df['ID'] = df['ID'].str.zfill(15) 

Ver más: http://pandas.pydata.org/pandas-docs/stable/text.html

Se puede lograr con una sola línea durante la inicialización. Solo usa el argumento de los convertidores .

 df = pd.read_excel('filename.xlsx', converters={'ID': '{:0>15}'.format}) 

así reducirás la longitud del código a la mitad 🙂

 df = pd.read_excel('filename.xlsx') df['ID'] = df['ID'].str.zfill(15) # df['ID'] = df['ID'].apply(lambda x: '{0:0>15}'.format(x)) 

PS: read_csv tiene este argumento también.

Con Python 3.6+, también puedes usar f-strings:

 df['ID'] = df['ID'].map(lambda x: f'{x:0>15}') 

El rendimiento es comparable o ligeramente peor en comparación con df['ID'].map('{:0>15}'.format) . Por otro lado, las cadenas F permiten una salida más compleja, y puede usarlas más eficientemente a través de una lista de comprensión.

Evaluación comparativa del rendimiento

 # Python 3.6.0, Pandas 0.19.2 df = pd.concat([df]*1000) %timeit df['ID'].map('{:0>15}'.format) # 4.06 ms per loop %timeit df['ID'].map(lambda x: f'{x:0>15}') # 5.46 ms per loop %timeit df['ID'].astype(str).str.zfill(15) # 18.6 ms per loop %timeit list(map('{:0>15}'.format, df['ID'].values)) # 7.91 ms per loop %timeit ['{:0>15}'.format(x) for x in df['ID'].values] # 7.63 ms per loop %timeit [f'{x:0>15}' for x in df['ID'].values] # 4.87 ms per loop %timeit [str(x).zfill(15) for x in df['ID'].values] # 21.2 ms per loop # check results are the same x = df['ID'].map('{:0>15}'.format) y = df['ID'].map(lambda x: f'{x:0>15}') z = df['ID'].astype(str).str.zfill(15) assert (x == y).all() and (x == z).all() 

Si te encuentras con el error:

Error de pandas: solo se puede usar el descriptor de acceso .str con valores de cadena, que utilizan np.object_ dtype en pandas

 df['ID'] = df['ID'].astype(str).str.zfill(15)