Conversión de una columna dentro del marco de datos de pandas de int a string

107

Tengo un marco de datos en pandas con columnas de datos int y str mixtas. Quiero concatenar primero las columnas dentro del marco de datos. Para hacer eso, tengo que convertir una intcolumna a str. Intenté hacer lo siguiente:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

o

mtrx['X.3'] = mtrx['X.3'].astype(str)

pero en ambos casos no funciona y aparece un error que dice "no se pueden concatenar objetos 'str' e 'int'". Concatenar dos strcolumnas funciona perfectamente bien.

Malfet
fuente

Respuestas:

138
In [16]: df = DataFrame(np.arange(10).reshape(5,2),columns=list('AB'))

In [17]: df
Out[17]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [18]: df.dtypes
Out[18]: 
A    int64
B    int64
dtype: object

Convertir una serie

In [19]: df['A'].apply(str)
Out[19]: 
0    0
1    2
2    4
3    6
4    8
Name: A, dtype: object

In [20]: df['A'].apply(str)[0]
Out[20]: '0'

No olvide volver a asignar el resultado:

df['A'] = df['A'].apply(str)

Convertir todo el marco

In [21]: df.applymap(str)
Out[21]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [22]: df.applymap(str).iloc[0,0]
Out[22]: '0'

df = df.applymap(str)
Jeff
fuente
3
Realmente no entiendo por qué, pero mtrx ['X.3']. Apply (str) tampoco funciona para mí :( dtype todavía muestra int64. El marco de datos para la fila 23177 y la columna X.3 solo tiene números. [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet
0.7.0, viene con python 2.7 en el sistema Ubuntu
Malfet
la versión actual es 0.12, debe actualizar.
Jeff
df ['A']. apply (str) no funciona. pero df.column_name = df.column_name.astype (str) funciona. No tengo idea de por qué.
Dmitry Konovalov
1
@DmitryKonovalov en las cadenas de Python son inmutables, por lo que cada vez que manipula los datos, debe volver a colocar el resultado en la variable.
Sriram Arvind Lakshmanakumar
92

Cambiar el tipo de datos de la columna DataFrame:

Para int:

df.column_name = df.column_name.astype(np.int64)

Para str:

df.column_name = df.column_name.astype(str)

tanaque
fuente
7
Esto es atractivo, pero es aproximadamente 4 veces más lento que el apply(str)de @Jeff, en mi prueba usando pd.Series(np.arange(1000000)).
John Zwinck
2
Esto funciona para mi. df['A'] = df['A'].apply(str)también funciona. La respuesta proporcionada por @Jeff no me funciona.
tommy.carstensen
1
Con respecto al comentario de @ JohnZwinck, usar Python3 parece ser más como 2x más rápido de usar en apply()lugar de astype(): timeit.Timer ('c.apply (str)', setup = 'import pandas as pd; c = pd.Series (range ( 1000)) '). Timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' importar pandas como pd; c = pd.Series (range (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r
15

Advertencia : Ambas soluciones proporcionadas ( astype () y apply () ) no conservan los valores NULL en la forma nan o None.

import pandas as pd
import numpy as np

df = pd.DataFrame([None,'string',np.nan,42], index=[0,1,2,3], columns=['A'])

df1 = df['A'].astype(str)
df2 =  df['A'].apply(str)

print df.isnull()
print df1.isnull()
print df2.isnull()

Creo que esto se soluciona mediante la implementación de to_string ()

Keith
fuente
1
to_string le permite elegir el manejo de Nan, por ejemplo, para devolver una cadena vacía en lugar de 'Nan'
seanv507
1
(No estaba en desacuerdo, solo ampliando lo que dijiste) - quería decir +1
seanv507
8

Utilice el siguiente código:

df.column_name = df.column_name.astype('str')
Faraz Ramtin
fuente
0

Solo como referencia adicional.

Todas las respuestas anteriores funcionarán en el caso de un marco de datos. Pero si está utilizando lambda mientras crea / modifica una columna, esto no funcionará, porque allí se considera un atributo int en lugar de una serie pandas. Tienes que usar str (target_attribute) para convertirlo en una cadena. Consulte el siguiente ejemplo.

def add_zero_in_prefix(df):
    if(df['Hour']<10):
        return '0' + str(df['Hour'])

data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)
sujithramanathan
fuente