Importar la columna de marco de datos de pandas como cadena no int


97

Me gustaría importar el siguiente csv como cadenas, no como int64. Pandas read_csv lo convierte automáticamente a int64, pero necesito esta columna como cadena.

ID
00013007854817840016671868
00013007854817840016749251
00013007854817840016754630
00013007854817840016781876
00013007854817840017028824
00013007854817840017963235
00013007854817840018860166


df = read_csv('sample.csv')

df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID

Desafortunadamente, el uso de convertidores da el mismo resultado.

df = read_csv('sample.csv', converters={'ID': str})
df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID

3
Destaca claramente un problema en el que los convertidores no funcionan. Por lo tanto, sigue siendo útil además de la pregunta mencionada anteriormente.
Dav Clark

Respuestas:


152

Solo quiero reiterar que esto funcionará en pandas> = 0.9.1:

In [2]: read_csv('sample.csv', dtype={'ID': object})
Out[2]: 
                           ID
0  00013007854817840016671868
1  00013007854817840016749251
2  00013007854817840016754630
3  00013007854817840016781876
4  00013007854817840017028824
5  00013007854817840017963235
6  00013007854817840018860166

Estoy creando un problema sobre la detección de desbordamientos de enteros también.

EDITAR: Vea la resolución aquí: https://github.com/pydata/pandas/issues/2247


14
También parece, si desea que todas las columnas que deben ser interpretadas como cadenas, se puede hacer lo siguiente: dtype = str.
steveb

Parece que los campos vacíos siguen apareciendo como np.nan
Josiah Yoder

1
misma pregunta aquí. Pero utilicé keep_default_na = False resolvió mi problema.
Jack.Lee

Gracias por los comentarios. También tuve que usar dypte = str AND keep_default_na = False para que los valores nulos no fueran nan.
Ross117

19

Probablemente esta no sea la forma más elegante de hacerlo, pero hace el trabajo.

In[1]: import numpy as np

In[2]: import pandas as pd

In[3]: df = pd.DataFrame(np.genfromtxt('/Users/spencerlyon2/Desktop/test.csv', dtype=str)[1:], columns=['ID'])

In[4]: df
Out[4]: 
                       ID
0  00013007854817840016671868
1  00013007854817840016749251
2  00013007854817840016754630
3  00013007854817840016781876
4  00013007854817840017028824
5  00013007854817840017963235
6  00013007854817840018860166

Simplemente reemplácelo '/Users/spencerlyon2/Desktop/test.csv'con la ruta a su archivo


6

Desde pandas 1.0 se volvió mucho más sencillo. Esto leerá la columna 'ID' como dtype 'cadena':

pd.read_csv('sample.csv',dtype={'ID':'string'})

Como podemos ver en esta guía de introducción, se ha introducido el dtype 'string' (antes de que las cadenas se trataran como dtype 'object').

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.