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
Oliver
fuente
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

Wes McKinney
fuente
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

spencerlyon2
fuente
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').

Kuffner
fuente