Importer la colonne de dataframe pandas comme chaîne non int

97

Je voudrais importer le csv suivant en tant que chaînes et non en int64. Pandas read_csv le convertit automatiquement en int64, mais j'ai besoin de cette colonne sous forme de chaîne.

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

Malheureusement, l'utilisation de convertisseurs donne le même résultat.

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
la source
3
Cela met clairement en évidence un problème où les convertisseurs ne fonctionnent pas. Donc, c'est toujours utile en plus de la question mentionnée ci-dessus.
Dav Clark

Réponses:

152

Je veux juste réitérer que cela fonctionnera dans les 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

Je crée également un problème concernant la détection des débordements d'entiers.

EDIT: Voir la résolution ici: https://github.com/pydata/pandas/issues/2247

Wes McKinney
la source
14
Il semble aussi, si vous voulez que toutes les colonnes à être interprétées comme des chaînes, on peut faire ce qui suit: dtype = str.
steveb
Il semble que des champs vides passent toujours par np.nan
Josiah Yoder
1
même question ici. Mais j'ai utilisé keep_default_na = False a résolu mon problème.
Jack.Lee
Merci pour les commentaires. J'ai également dû utiliser dypte = str ET keep_default_na = False pour que les valeurs nulles ne soient pas nan.
Ross117 le
19

Ce n'est probablement pas la façon la plus élégante de le faire, mais cela fait le travail.

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

Remplacez simplement '/Users/spencerlyon2/Desktop/test.csv'par le chemin de votre fichier

spencerlyon2
la source
6

Depuis pandas 1.0, c'est devenu beaucoup plus simple. Cela lira la colonne 'ID' comme dtype 'string':

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

Comme nous pouvons le voir dans ce guide de démarrage , le dtype 'string' a été introduit (avant que les chaînes ne soient traitées comme dtype 'object').

Kuffner
la source