138 votes

Importer une colonne de dataframe pandas en tant que chaîne de caractères et non en tant qu'int.

Je voudrais importer le csv suivant en tant que chaîne de caractères et non en tant que int64. Pandas read_csv le convertit automatiquement en int64, mais j'ai besoin de cette colonne en tant que 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

218voto

Wes McKinney Points 17545

Je tiens à rappeler que cela fonctionne avec 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 suis en train de créer une question sur la détection des débordements d'entiers également.

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

Mettez à jour si cela peut aider d'autres personnes :

Pour avoir toutes les colonnes comme str, on peut le faire (d'après le commentaire) :

pd.read_csv('sample.csv', dtype = str)

Pour avoir la plupart des colonnes ou des colonnes sélectives comme str, on peut le faire :

# lst of column names which needs to be string
lst_str_cols = ['prefix', 'serial']
# use dictionary comprehension to make dict of dtypes
dict_dtypes = {x : 'str'  for x in lst_str_cols}
# use dict on dtypes
pd.read_csv('sample.csv', dtype=dict_dtypes)

21voto

spencerlyon2 Points 5522

Ce n'est probablement pas la manière la plus élégante de procéder, mais elle permet de faire 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' avec le chemin d'accès à votre fichier

18voto

Kuffner Points 321

Depuis pandas 1.0, c'est devenu beaucoup plus simple. La colonne 'ID' sera lue comme dtype 'string' :

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

Comme nous pouvons le voir dans cette Guide de démarrage Le dtype 'string' a été introduit (auparavant, les chaînes de caractères étaient traitées comme le dtype 'object').

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X