Importar a coluna do dataframe do pandas como string não int

97

Eu gostaria de importar o seguinte csv como strings, não como int64. O Pandas read_csv o converte automaticamente em int64, mas preciso dessa coluna como string.

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

Infelizmente, o uso de conversores dá o mesmo 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
fonte
3
Ele destaca claramente um problema em que os conversores não funcionam. Portanto, ainda é útil além da questão mencionada acima.
Dav Clark

Respostas:

152

Só quero reiterar que isso funcionará em 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

Estou criando um problema sobre a detecção de estouros de inteiros também.

EDIT: Veja a resolução aqui: https://github.com/pydata/pandas/issues/2247

Wes McKinney
fonte
14
Parece também, se você quiser todas as colunas devem ser interpretados como cordas, pode-se fazer o seguinte: dtype = str.
steveb
Parece que os campos vazios ainda aparecem como np.nan
Josiah Yoder
1
mesma pergunta aqui. Mas eu usei keep_default_na = False e resolvi meu problema.
Jack.Lee
Obrigado pelos comentários. Eu também tive que usar dypte = str AND keep_default_na = False para que os valores nulos não fossem nan.
Ross117
19

Essa provavelmente não é a maneira mais elegante de fazer isso, mas dá conta do recado.

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

Basta substituir '/Users/spencerlyon2/Desktop/test.csv'pelo caminho para o seu arquivo

spencerlyon2
fonte
6

Desde o pandas 1.0, ele se tornou muito mais simples. Isso lerá a coluna 'ID' como dtype 'string':

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

Como podemos ver neste guia de introdução , 'string' dtype foi introduzido (antes de as strings serem tratadas como dtype 'objeto').

Kuffner
fonte